【发布时间】:2026-02-04 07:25:01
【问题描述】:
我已经编写了一个小型库(在 C++11 中)来计算四元数,但我很快意识到存在许多精度/准确性问题,因为涉及到很多浮点运算。这让我开始研究 std::complex 和 IEEE 754。std::complex 在处理 NaN 方面做了相当多的工作。这是我唯一需要担心成为“IEEE 754 兼容”的事情吗?更一般地说,是否有一个“秘诀”可以将原本幼稚的数值库转变为“符合 IEEE 754”的库?
注意:问题不在于编译器是否是IEEE 754,而在于我是否应该在自己的算法中采取特殊步骤来满足IEEE 754。毕竟我是同一个位置作为编写 std::complex 的人,他们确实采取了额外的步骤,例如对于 NaN。
【问题讨论】:
-
旁注:如果您关心速度,请注意poor performance of
std::complex -
谢谢!确实——所以我打算让 IEEE 754 一致性成为可选的。但是英特尔的一篇论文(当然!)警告我,如果我的库不是 IEEE-754,就会发生火箭坠毁等等。
-
四元数运算(如乘法)通常处理(有符号)乘积的运行总和。您可以将Kahan summation 视为一种相对便宜的方法来提高符合 IEEE-754 的准确性。您还可以查看一个相对成熟的实现,例如 Boost 的四元数类。我想像分支切割等复杂的概念,如果你想保持一致的话,在理论上会用四元数变得更加陌生。
-
另请注意,如果您使用四元数进行旋转,则应在应用操作后(重新)规范化它们,以将它们保持为“单位”旋转。
标签: c++ c++11 floating-point numeric ieee-754