【发布时间】:2011-12-25 18:18:31
【问题描述】:
我在 wikipedia (http://en.wikipedia.org/wiki/Type_conversion#Implicit_type_conversion) 上偶然发现了以下示例。
#include <stdio.h>
int main()
{
int i_value = 16777217;
float f_value = 16777217.0;
printf("The integer is: %i\n", i_value); // 16777217
printf("The float is: %f\n", f_value); // 16777216.000000
printf("Their equality: %i\n", i_value == f_value); // result is 0
}
他们的解释:“这种奇怪的行为是由于 i_value 与 f_value 比较时隐式转换为浮动造成的;这种转换失去了精度,使得被比较的值不同。”
这不是错的吗?如果将 i_value 强制转换为浮点数,那么两者的精度损失将相同,并且它们将相等。 所以 i_value 必须强制转换为 double。
【问题讨论】:
-
使用 g++ (GCC 4.6.2) 我得到
1表示平等。 -
@Kerrek:还有我。在 VS 中,我得到 0。
-
@OliCharlesworth:我很好奇将文字更改为
f或将类型更改为double——在所有情况下我都会得到1... -
您可能正在使用 x64 系统,它不使用 10 字节扩展,而是使用通常的双精度。您还可以使用 -mfpmath=sse -msse 在 32 位 cpu 上观察这一点。
标签: c floating-point type-conversion