C++ 浮点数的大小比较
一、C++的精度损失
浮点数的存储格式:
符号位 | 指数位 | 尾数位 |
---|---|---|
sign bit | Exponent | Mantissa |
浮点数分为单精度float和双精度double,32位和64位系统存储位数略有不同。
相对于二进制存储小数,假设只用1位小数存储:
则精度为0.5:
.1 表示 0.5
.0 表示 0.0
以此类推:
精度 e = 1 2 n 精度 e ={1 \above{1pt} 2 ^ n } 精度e=2n1
二、浮点数比较
#include <iostream>
#include <algorithm>
int main()
{
double a = 1.1; //1.1000000000000001
double b = 1.1 + 1e-16; //1.1000000000000001,精度损失
bool ret = std::abs(a - b) < std::abs(std::min(a, b)) * std::numeric_limits<double>::epsilon(); //true
}
三、总结
浮点数的精度损失可以根据实际情况自定义,但不可使用==来比较两个浮点数是否相等。