【问题标题】:Denormalized float number is detected as NaN. Why?非规格化浮点数被检测为 NaN。为什么?
【发布时间】:2012-03-17 16:57:17
【问题描述】:

目前,我正在传输一个非规格化浮点数 = 0x00300000。在为另一个变量设置此值之前,先进行不等式 (var != var) 检查,即检查 NaN。非规范化数的不等式检查失败,该数被检测为 NaN。

你能告诉我我在这里做错了什么吗?我的代码在 C 中。

谢谢。

【问题讨论】:

  • 我不确定我是否喜欢“非规范化浮点数 = 0x00300000”...您绝对确定浮点变量具有该位模式作为值?如果你 printf 会发生什么?
  • 向我们展示您的代码。 (var != var) 评估和 NaN 通常不会在 C 代码中看到。 Javascript 是的,但我对你在 C 中所做的事情感到困惑。所以向我们展示你的代码。
  • 你能给我一个十六进制的非规范化数字吗?如果我没有有效的非规范化数字,我将尝试相同的方法并查看发生了什么。 @Mysticial:它与显示给我的数字相同,但未通过不等式检查。和编译器设置有关系吗?
  • 我想非规范化的浮点数会破坏数学运算的算法,因为这些算法假设操作数是规范化的。 (通过算法 - 我是指 ALU 中的硬件)
  • 你的编译器和平台是什么,你如何编译(即用什么选项)?

标签: c floating-point nan


【解决方案1】:

平等检查在我的系统上似乎很好:

#include <stdio.h>
#include <string.h>

int main(void) {
    int i = 0x00300000;
    float f = 0;
    if (sizeof(f) != sizeof(i)) {
        printf ("Urk!\n");
        return 1;
    }
    memcpy (&f, &i, sizeof(f));
    printf ("%.50f\n", f);
    if (f == f)
        puts ("Equal");
    else
        puts ("Not equal");
    return 0;
}

这个输出:

0.00000000000000000000000000000000000000440810381558
Equal

【讨论】:

  • 这里也一样。此外,如果我为 i 使用值 0xFFFFFFFF,它会按预期打印值 NAN 和“不等于”。所以我的猜测是问题中的值不具有 OP 期望它具有的值。
  • 我猜这与编译器选项或设置有关。
猜你喜欢
  • 2018-07-11
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2013-04-10
  • 2012-03-09
  • 2016-08-15
相关资源
最近更新 更多