【发布时间】:2012-09-16 21:40:29
【问题描述】:
有以下工会:
union {double first_d; uint64 first;};
union {double second_d; uint64 second;};
...
first_d = <a double value>
second_d = <a double value>
是否输出以下比较:
if(first_d > second_d)
// CASE 1 OUTPUT
else if(first_d < second_d)
// CASE 2 OUTPUT
else
// CASE 3 OUTPUT
下面的总是一样的?
if(first> second)
// CASE 1' OUTPUT
else if(first < second)
// CASE 2' OUTPUT
else
// CASE 3' OUTPUT
【问题讨论】:
-
浮点表示和整数表示不能使用 >、equality。
-
忽略 NaN 和无穷大为什么不起作用?考虑到双精度的表示,|符号||指数|尾数|,如果分配的双精度为正,它不起作用吗?此外,通过检查 uint64 的第一位并反转比较的方向,处理负双精度值会很容易。对吗?
-
@fireant 除了
NaN、INF和可能的符号位之外,是的,浮点比较与整数比较是一致的。该表示是有意设计的,以使硬件更简单。 -
@Mysticial:这对于 IEEE 浮点表示是正确的(我相信)。对于其他浮点表示,它可能正确,也可能不正确。 (请注意,随着时间的推移,IEEE 以外的代表越来越少。)
-
@KeithThompson 是的,我专门指的是 IEEE 表示。虽然你说得对,现在它变得如此普遍,以至于我们默认默认为 IEEE。
标签: c double long-integer unsigned unions