C++中不同float变量打印输出相同值的问题咨询
为啥两个不同的float变量打印出来一模一样?
先给你拆解一下你代码里那俩float的真实值:
- 变量
a的二进制位是0x40800000,对应IEEE 754单精度浮点数的4.0(符号位0,指数算出来是2,尾数是1.0,乘起来就是1.0 * 2^2 = 4.0) - 变量
b的二进制位是0x407FFFFF,真实值其实是≈3.9999997615814209(指数是1,尾数是1 + (2^23-1)/2^23,算出来就是(1 + 8388607/8388608) * 2^1 ≈3.99999976)
核心原因:你猜的没错!就是输出精度限制搞的鬼
C++里std::cout默认只输出6位有效数字的浮点数。你看b的真实值3.99999976...,前6位有效数字四舍五入之后就是4.0——和a的4.0完全撞脸,所以打印出来看起来一模一样。
怎么验证?调高输出精度就行
给你改了下代码,加上精度设置,就能看到俩变量的差异了:
#include<stdint.h> #include<iostream> #include<iomanip> // 要加这个头文件才能调精度 union FP32 { float f; uint32_t bits; }; int main(void) { FP32 a, b; a.bits = 0x40800000; b.bits = 0x407FFFFF; // 把输出精度调到15位有效数字 std::cout << std::setprecision(15); std::cout << a.f << std::endl; std::cout << b.f << std::endl; // 还可以用十六进制浮点格式输出,直接看底层对应的浮点值 std::cout << std::hexfloat; std::cout << a.f << std::endl; std::cout << b.f << std::endl; return 0; }
运行后会输出:
4 3.99999976158142 0x1p+2 0x1.fffffep+1
这下就能明显看到俩变量的区别了吧~
额外提一嘴
单精度float的有效精度大概在6-7位十进制数字左右,超过这个范围的数没法精确表示,而且输出时如果精度不够,就容易出现这种“看起来一样但实际不同”的情况。要是以后需要精确控制浮点输出的格式,记得用<iomanip>里的std::setprecision、std::fixed这些工具哦。
内容的提问来源于stack exchange,提问作者RD1153
相关产品推荐
相关产品推荐

