【问题标题】:Using an union, can I compare two doubles via unsigned int?使用联合,我可以通过 unsigned int 比较两个双精度数吗?
【发布时间】: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 除了NaNINF 和可能的符号位之外,是的,浮点比较与整数比较是一致的。该表示是有意设计的,以使硬件更简单。
  • @Mysticial:这对于 IEEE 浮点表示是正确的(我相信)。对于其他浮点表示,它可能正确,也可能不正确。 (请注意,随着时间的推移,IEEE 以外的代表越来越少。)
  • @KeithThompson 是的,我专门指的是 IEEE 表示。虽然你说得对,现在它变得如此普遍,以至于我们默认默认为 IEEE。

标签: c double long-integer unsigned unions


【解决方案1】:

不。这是一个使用NaNs的反例:

int main()
{

    union {double first_d; uint64 first;};
    union {double second_d; uint64 second;};

    first  = 0x7ff8000000000001;
    second = 0x7ff8000000000002;

    if(first_d > second_d)
        printf("greater\n");
    else if(first_d < second_d)
        printf("less\n");
    else
        printf("other\n");

    if(first > second)
        printf("greater\n");
    else if(first < second)
        printf("less\n");
    else
        printf("other\n");

    return 0;
}

输出:

other
less

我还要提到,通过联合的类型双关语不是 100% 符合标准的。所以你也可以说这是未定义的行为。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2015-06-16
    • 1970-01-01
    • 2021-08-13
    • 2018-06-05
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多