相关疑难解决方法(0)

对于IEEE754 NaN值,所有比较返回false的理由是什么?

为什么NaN值的比较与所有其他值的行为不同?也就是说,与运算符==,<=,> =,<,>的所有比较(其中一个或两个值为NaN)返回false,这与所有其他值的行为相反.

我想这可以通过某种方式简化数值计算,但我找不到明确说明的理由,甚至在Kahan 的IEEE 754状态讲义中也没有详细讨论其他设计决策.

这种异常行为在进行简单数据处理时会造成麻烦.例如,当在C程序中对某些实值字段的记录列表进行排序时,我需要编写额外的代码来处理NaN作为最大元素,否则排序算法可能会变得混乱.

编辑: 迄今为止的答案都认为比较NaNs毫无意义.

我同意,但这并不意味着正确的答案是错误的,而是一个非布尔值(NaB),幸运的是它不存在.

因此,在我看来,选择返回真或假的比较是任意的,对于一般数据处理,如果它遵循通常的定律(==的反射性,<= =,>的三分法),那将是有利的,以免数据结构依赖这些法律变得困惑.

因此,我要求打破这些法律的一些具体优势,而不仅仅是哲学推理.

编辑2: 我想我现在理解为什么使NaN最大化是一个坏主意,它会搞砸上限的计算.

可能需要NaN!= NaN以避免检测环路中的收敛,例如

while (x != oldX) {
    oldX = x;
    x = better_approximation(x);
}
Run Code Online (Sandbox Code Playgroud)

然而,最好通过比较绝对差异与小限制来编写.所以恕我直言,这是打破NaN反身性的一个相对弱的论据.

floating-point comparison nan ieee-754 iec10967

240
推荐指数
5
解决办法
4万
查看次数

std::min 的参数顺序更改浮点的编译器输出

我在编译器资源管理器中摆弄,我发现传递给 std::min 的参数顺序改变了发出的程序集。

这是 Godbolt Compiler Explorer 上的示例

double std_min_xy(double x, double y) {
    return std::min(x, y);
}

double std_min_yx(double x, double y) {
    return std::min(y, x);
}
Run Code Online (Sandbox Code Playgroud)

这被编译(例如,在 clang 9.0.0 上使用 -O3):

std_min_xy(double, double):                       # @std_min_xy(double, double)
        minsd   xmm1, xmm0
        movapd  xmm0, xmm1
        ret
std_min_yx(double, double):                       # @std_min_yx(double, double)
        minsd   xmm0, xmm1
        ret
Run Code Online (Sandbox Code Playgroud)

如果我将 std::min 更改为老式三元运算符,这种情况仍然存在。它也适用于我尝试过的所有现代编译器(clang、gcc、icc)。

底层指令是minsd. 阅读文档,第一个参数minsd也是答案的目的地。显然 xmm0 是我的函数应该放置其返回值的地方,所以如果 xmm0 用作第一个参数,则movapd不需要。但是如果 xmm0 是第二个参数,那么它必须movapd xmm0, xmm1将值放入 xmm0。(编者注:是的,x86-64 System V在 …

c++ floating-point x86 assembly android

75
推荐指数
3
解决办法
2771
查看次数

浮点NaN有效载荷有什么用?

我知道IEEE 754定义NaN具有以下按位表示:

  • 符号位可以是01
  • 指数字段包含所有1
  • 尾数的一些位用于指定它是安静的NaN还是信号NaN
  • 尾数不能是所有0位,因为该位模式被保留用于表示无穷大
  • 尾数的剩余比特形成有效载荷

当计算输入为NaN时,有效载荷会传播(就像整个NaN一样)到浮点计算的结果,尽管我不知道这种传播的细节,或者标准是否指定了如何完成.谁设置原始有效载荷?如果我添加两个具有不同有效负载的NaN会发生什么?

但最重要的是:我从未见过以前使用的NaN有效载荷.这个有效载荷字段有什么用途?

floating-point nan ieee-754

10
推荐指数
2
解决办法
950
查看次数

标签 统计

floating-point ×3

ieee-754 ×2

nan ×2

android ×1

assembly ×1

c++ ×1

comparison ×1

iec10967 ×1

x86 ×1