Advertisement

浮点数精度与IEEE 754标准的理解

阅读量:

浮点数在赋值时不是准确按照输入多少就赋值多少,而是按照浮点数精度有效数来赋值的。例如下图,

如何判断两个浮点数是否相等?用减法,两个浮点数相减,然后差的绝对值在精度范围之内。如float,就是 | a - b | <= 1e -6或者 1e -7。

复制代码
 #include<stdio.h>

    
 #include<stdlib.h>
    
  
    
 int main()
    
 {
    
     float i =1.456;
    
     if(i - 1.456 >= -1e-6 && i - 1.456 <= 1e-6)    //也可以是1e-7; 1e-6精度上更加保守准确,因 
    
                                                //为float有效位数就是6~7位
    
      printf("equal\n");
    
     else
    
      printf("not equal\n");
    
     return 0;
    
  
    
 }
    
    
    
    

IEEE 754标准

符号位 阶码(指数部分) 尾数(小数部分)

S EEEEEEEE MMMM MMMM MMMM MMMM MMMM MMM

1位 8位 23位

0 1000 0001 0010 0000 0000 0000 0000 000

阶码部分:确定数值范围---> 2^8 = 255, 正常分正负为 [ -128, 127 ] , IEEE-754规定计算时要减127,即255-127 = 128,所以范围是[ -127, 128 ]. 所以float的数值范围是 10-38~1038。(这个逻辑需要验证)

尾数部分:2^23 = 838 8608, 数字长度为7位,有效数字范围是6位~7位(为什么是6到7位?因为低于838 8608可以取到7位,高于这个数则不能取7位,6位最大值为999 999一定取得到)(这个逻辑需要验证)

二进制 0100 0000 1001 0000 0000 0000 0000 0000

十六进制 40 90 00 00

阶码:1000 0001 转十进制为129, 129 - 127 = 2;

尾数:001 0000 0000 0000 0000 0000 ,左边省略了一个1,所以正常为1.001 0000 0000 0000 0000 0000,根据阶码左移位2即为100.1,整数位100转十进制为4,0.1转十进制为2^-1,即为0.5,相加等于十进制数4.5。

浮点数小数部分是根据2{-1}+2{-2}+2^{-3}+......来近似一个小数的。

%f字节

怎么能输入出1.45599997呢?

全部评论 (0)

还没有任何评论哟~