Menu Close

什么是浮点变量?

浮点型数据类型,也可称实数数据类型。该数据类型用于存储单精度浮点数或双精度浮点数。浮点数使用 IEEE(电气和电子工程师协会)格式。

浮点类型的单精度值具有 4 个字节,包括一个符号位、一个 8 位 二进制指数和一个 23 位尾数。

1.浮点(实型)数据类型

像整数一样,在“ C”程序中,我们也可以使用浮点数据类型。 ‘float’关键字用于表示浮点数据类型。 它可以保存浮点值,这意味着数字具有指数和小数点(底部)部分。

浮点值是包含小数点的实数。 整数数据类型不存储小数点部分。

浮点数据类型有二种形式:

  1. 十进制小数形式,
  2. 指数形式。

1)十进制数形式:由数码 0~ 9 和小数点组成。

2)指数形式:由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为:

  • a E n(a 为十进制数,n 为十进制整数)(其值: a*10n
  • 2.1E5 (等于 2.1*105)

2. 浮点数据类型在内存中的存放形式

实数 3.14159 在内存中的存放形式如下:

%title插图%num

  • 小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高
  • 指数部分占的位数愈多,则能表示的数值范围愈大。

实型数据一般占 4 个字节(32 位)内存空间。按指数形式存储。

根据IEEE标准,浮点数是通过科学计数法来存储的,比如120.5用十进制的科学计数法来表示就是1.205*102.

但是计算机中所有数据都是用二进制存储的,所以需要把120.5先转换为二进制数,即1.1110001*26.

%title插图%num

%title插图%num

浮点数在计算机中的存储分为三个部分:
1. 符号位(sign):float和double符号位均为1位,0代表正数,1代表负数
2. 指数位(exponent):存储科学计数法中的指数部分,采用移位存储
3. 尾数位(Mantissa, fraction):存储科学计数法中的尾数部分( 小数部分,分数部分,底数部分)

根据IEEE 754标准,单精度float类型使用32比特(4节)存储,其中1位表示符号,8位表示指数,23位表示尾数;双精度double类型使用64比特(8节)存储,1位符号位,11位指数位,52位尾数位。

3. 实数类型存储示例

以数字6.5为例,看一下这个数字是怎么存储在

1
float

变量中的:

      1. 先来看整数部分,模2求余可以得到二进制表示为110。
      2. 再来看小数部分,乘2取整可以得到二进制表示为.1。
      3. 拼接在一起得到110.1然后写成类似于科学计数法,得到1.101 x 2 2
      4. 从上面的公式中可以知道符号为正,尾数是101,指数是2。
      5. 符号为正,那么第一位填0,指数是2,加上偏移量(bias) 127等于129,二进制表示为10000001,填到2-9位,剩下的尾数101填到尾数位上即可。

%title插图%num

 

内存中二进制数01000000 11010000 00000000 00000000表示的就是浮点数6.5

使用浮点数时,必须在标识符之前放置关键字单精度(float) / 双精度(double) /长双精度 (long double)。

下列图表给出浮点数的字节,范围大小和精度。

%title插图%num

单精度型占 4 个字节(32 位)内存空间,其数值范围为 3.4E-38~3.4E+38,双精度型占 8 个字节(64 位)内存空间,其数值范围为 1.7E-308~1.7E+308,可提供 16 位有效数字。

4.浮点变量

浮点数的类型声明使用

1
float,double, long double

关键字,用来声明浮点数变量

1
 
float c = 10.5;
double b;
long double c;

上面示例中,变量

1
c

的就是浮点数类型。

1
float

类型占用4个字节(32位),其中8位存放指数的值和符号,剩下24位存放小数的值和符号。

1
float

类型至少能够提供(十进制的)6位有效数字,指数部分的范围为(十进制的)

1
-37

1
37

,即数值范围为10-37到1038

有时候,32位浮点数提供的精度或者数值范围还不够,C 语言又提供了另外两种更大的浮点数类型。

  • 1
    double

    :占用8个字节(64位),至少提供13位有效数字。

  • 1
    long double

    :通常占用16个字节。

注意,由于存在精度限制,浮点数只是一个近似值,它的计算是不精确的,比如 C 语言里面

1
0.1 + 0.2

并不等于

1
0.3

,而是有一个很小的误差。

if (0.1 + 0.2 == 0.3) // false

C 语言允许使用科学计数法表示浮点数,使用字母

1
e

来分隔小数部分和指数部分。

double x = 123.456e+3; // 123.456 x 10^3
// 等同于
double x = 123.456e3;

上面示例中,

1
e

后面如果是加号

1
+

,加号可以省略。注意,科学计数法里面

1
e

的前后,不能存在空格。

另外,科学计数法的小数部分如果是

1
0.x

1
x.0

的形式,那么

1
0

可以省略。

0.3E6
// 等同于
.3E6

3.0E6
// 等同于
3.E6

float头文件 – C 标准库的 float.h 头文件包含了一组与浮点值相关的依赖于平台的常量。

例1. 浮点类型存储空间的字节大小和最大值及最小值

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>
int main( )
{
   printf("Storage size for float : %d \n", sizeof(float));
   printf("FLT_MAX : %g\n", (float) FLT_MAX);
   printf("FLT_MIN : %g\n", (float) FLT_MIN);
   printf("-FLT_MAX : %g\n", (float) -FLT_MAX);
   printf("-FLT_MIN : %g\n", (float) -FLT_MIN);
   printf("DBL_MAX : %g\n", (double) DBL_MAX);
   printf("DBL_MIN : %g\n", (double) DBL_MIN);
   printf("-DBL_MAX : %g\n", (double) -DBL_MAX);
   printf("Precision value: %d\n", FLT_DIG );
   return 0;
}

通过这两个参数,程序可以获知自身在启动时的命令行信息。

 

%title插图%num

例2.

#include <stdio.h>
int main()
{
    int a = 1;
    char b = 'G';
    double c = 3.14;
    printf("Hello World!\n");
 
    // printing the variables defined
    // above along with their sizes
    printf("Hello! I am a character. My value is %c and "
           "my size is %lu byte.\n",
           b, sizeof(char));
    // can use sizeof(b) above as well
 
    printf("Hello! I am an integer. My value is %d and "
           "my size is %lu  bytes.\n",
           a, sizeof(int));
    // can use sizeof(a) above as well
 
    printf("Hello! I am a double floating point variable."
           " My value is %lf and my size is %lu bytes.\n",
           c, sizeof(double));
    // can use sizeof(c) above as well
 
    printf("Bye! See you soon. :)\n");
 
    return 0;
}

输出结果:

Hello World!
Hello! I am a character. My value is G and my size is 1 byte.
Hello! I am an integer. My value is 1 and my size is 4 bytes.
Hello! I am a double floating point variable. My value is 3.140000 and my size is 8 bytes.
Bye! See you soon. :)

 

Posted in C语言

发表评论

相关链接