浮点数的大小比较为什么不能用等号?

 
 

1、不是所有的数都可以用浮点数精确表示,如3.333 二进制表示1*2^1+1*2^0+0*2^(-1)+1*2^(-2)...。内存中存储的仅是真实值得近似值。有精度误差

2、浮点数精度不同

 
 
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    float a = (float)0.1;
    float b = (float)0.1;
    if(a == b)
        cout << "a == b" << endl;
    else
        cout << "a == b" << endl;

    float c = (float)0.1;
    double d = (double)0.1;
    if(c == d)//c、d值在内存中的存储不同,d存储长度>c长度,固 d>c
        cout << "c == d" << endl;
    else
        cout << "c != d" << endl;

    float e = (float)0.1;
    float f = (double)0.1;
    if(abs(e - f) < 0.0001)
        cout << "e == f" << endl;
    else
        cout << "e != f" << endl;

    return 0;
}


 
 

  从该例子可以看出,对于同一个小数,当用不同精度表示时,结果是不一样的,不能直接用等号比较大小。

3、寄存器与内存表示浮点数精度不同

  按照博文计算机中基本类型float值表示和大小比较问题的说法: 

  即使在精度相同的情况下,比较也可能会出问题。因为在运算过程中会将内存(或高速缓存)中的值加载到CPU浮点寄存器(80 bit扩展精度)中,然后再进入CPU浮点计算单元进行计算,计算结果写回浮点寄存器,然后写回内存(或高速缓存)。从内存到浮点寄存器,浮点数的精度会扩展,从浮点寄存器到内存,浮点数的精度会降低(精度扩展通常没问题,但如果精度降低了,很可能值会发生变化,出现截断),而浮点运算的结果由于下面还要使用所以暂时保存在浮点寄存器中留待下次使用(没有及时写回内存,这是一种优化策略),从而导致数据并不是内存中和内存中的数据比较而是浮点寄存器中的值和内存中的值进行比较,而无论内存中是float类型还是double类型,其精度和浮点寄存器精度都不相同,从而导致比较结果是不相等。  


猜你喜欢

转载自blog.csdn.net/xmzzy2012/article/details/78957307
今日推荐