如果这里的输出是 "Not-Equal" 那么为什么使用 double 而不是 float 不能给出相同的输出?
If output here is "Not-Equal" then why using double instead of float not give the same output?
`float x = 0.1;
if (x == 0.1)
printf("Equal");
else
printf("Not-Equal");`
当浮点数从二进制表示中切掉一些位时,双精度数也是如此。虽然 double 0.1 比 float 具有更高的精度,但仍然不完全等于且小于 0.1。因此,如果 float 0.1 的输出不等于,则 double 0.1 的输出必须不等于。
像 0.1 这样的文字是双精度数。
当编译器处理 'float x = 0.1' 时,它会找到最接近 0.1 的双精度数,然后将其转换为浮点数,并将其分配给 x。
当编译器处理 'if ( x == 0.1)' 时,它找到最接近 0.1 的双精度,然后注意到您正在比较浮点数和双精度数,因此它将 x 转换为双精度数并比较双精度数。
就好像你写的一样
double lit = 0.1;
float x = (float)lit;
if ( ((double)x) == lit)
...
那么问题来了:(double)(float)lit 和 lit 一样吗?在这种情况下,答案是否定的。
如果您使用的是 0.1f 而不是 0.1,则不会转换为双精度数,因为 0.1f 是浮点数。
`float x = 0.1;
if (x == 0.1)
printf("Equal");
else
printf("Not-Equal");`
当浮点数从二进制表示中切掉一些位时,双精度数也是如此。虽然 double 0.1 比 float 具有更高的精度,但仍然不完全等于且小于 0.1。因此,如果 float 0.1 的输出不等于,则 double 0.1 的输出必须不等于。
像 0.1 这样的文字是双精度数。
当编译器处理 'float x = 0.1' 时,它会找到最接近 0.1 的双精度数,然后将其转换为浮点数,并将其分配给 x。
当编译器处理 'if ( x == 0.1)' 时,它找到最接近 0.1 的双精度,然后注意到您正在比较浮点数和双精度数,因此它将 x 转换为双精度数并比较双精度数。
就好像你写的一样
double lit = 0.1;
float x = (float)lit;
if ( ((double)x) == lit)
...
那么问题来了:(double)(float)lit 和 lit 一样吗?在这种情况下,答案是否定的。
如果您使用的是 0.1f 而不是 0.1,则不会转换为双精度数,因为 0.1f 是浮点数。