必知概念
- 浮点数由阶码和尾数两部分组成。
E 为阶码,M 为尾数。- 浮点数默认保存为 double 类型,就像整数默认为 int 型一样。
- float 的十进制精度为 7 位。
- double 的十进制精度为 16 位。
- 所以浮点数在计算机中存储时,可能出现 精度丢失 问题。
- 所以编程时一般都用 double 而不用 float,以免造成难以发现的 bug。
下面来看编译结果及代码(浮点数规格化就是对非规格化浮点数进行的处理,包括溢出处理)
源码:
#include<iostream>
#include<bitset>
int main() {
std::cout << "1.0 == 1.00000001 ? " << (1.0 == 1.00000001) << '\n';
std::cout << std::endl;
std::cout << "1.0f == 1.00000001f ? " << (1.0f == 1.00000001f) << " 丢失小数点后第八位 1 (浮点数规格化处理)" << '\n';
std::cout << "1.00000001f 的 36 位二进制表示 " << bitset<32>(1.00000001f)<< std::endl;
std::cout << std::endl;
std::cout << "1.0f == 0.99999998f ? " << (1.0f == 0.99999998f) << " 丢失小数点后第八位 8 (浮点数规格化处理)" << '\n';
std::cout << "0.99999998f 的 32 位二进制表示 " << bitset<32>(0.99999998f) << std::endl;
std::cout << std::endl;
std::cout << "2.0f == 1.99999995f ? " << (2.0f == 1.99999995f) << " 丢失小数点后第八位 5 (浮点数规格化处理)" << '\n';
std::cout << "1.99999995f 的 32 位二进制表示 " << bitset<32>(1.99999995f) << std::endl;
std::cout << std::endl;
return 0;
}