【发布时间】:2021-10-11 21:38:29
【问题描述】:
我运行这段代码
int a, b;
float t;
a = 18642731; //16777217:16777217 16777216.000000 16777216
t = (float)a;
b = (int)t;
if (a != b)printf("%d %f %d\n", a, t, b);
输出是
18642731 18642732.000000 18642732
编译器是 gcc 9.3.0。
为什么t不是18642731.000000的值
【问题讨论】:
-
因为IEEE标准见en.wikipedia.org/wiki/IEEE_754
-
18642731在二进制中是1000111000111011100101011需要 26 位。 IEEEfloat(单精度)类型具有24 + 1位精度。 -
int 和 float 在大多数实现中具有相同的大小,因此很明显,float 具有更大的范围,那么它会失去一些精度。重复:Strange behavior when casting an int to float in C、Understanding casts from integer to float、Casting int to float changes value
-
糟糕...单精度 IEEE 浮点具有
23 + 1位精度。我之前的评论在这方面是错误的。 -
查看问题的一种简单方法是:在该平台上,
ints 和float都使用 4 个字节,并且有 4294967296 个可能的不同的四字节字节。有符号整数确实有 4294967296 个不同的值(从 -2147483648 到 2147483647)...如果浮点数能够表示任何整数,那么应该使用什么 4 个字节的组合来表示0.5?它们都已经被整数占用了! ...这意味着如果您可以拥有0.5(不是整数),那么某些整数一定不能用浮点数表示。