<分区>
void main()
{
float f = 0.98;
if(f <= 0.98)
printf("hi");
else
printf("hello");
getch();
}
我在这里遇到了这个问题。在使用不同的 f 浮点值时,我得到了不同的结果。 为什么会这样?
<分区>
void main()
{
float f = 0.98;
if(f <= 0.98)
printf("hi");
else
printf("hello");
getch();
}
我在这里遇到了这个问题。在使用不同的 f 浮点值时,我得到了不同的结果。 为什么会这样?
最佳答案
f
正在使用 float
精度,但 0.98 在 double
中默认精度,所以语句 f <= 0.98
使用 double
进行比较精度。
f
因此转换为 double
在比较中,但可能会使结果略大于0.98。
使用
if(f <= 0.98f)
或使用 double
对于 f
相反。
详细...假设float
是IEEE single-precision和 double
是IEEE double-precision .
这些类型的 float 以 base-2 表示形式存储。在 base-2 中,这个数字需要无限的精度来表示,因为它是一个重复的小数:
0.98 = 0.1111101011100001010001111010111000010100011110101110000101000...
A float
只能存储24位有效数字,即
0.111110101110000101000111_101...
^ round off here
= 0.111110101110000101001000
= 16441672 / 2^24
= 0.98000001907...
A double
可以存储53位有效数字,所以
0.11111010111000010100011110101110000101000111101011100_00101000...
^ round off here
= 0.11111010111000010100011110101110000101000111101011100
= 8827055269646172 / 2^53
= 0.97999999999999998224...
因此 float
中的 0.98 会变得稍大和更小的 double
.
关于c - 浮点比较中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3962724/