我已经编写了一个小型库(在C 11中)来计算四元数,但我很快意识到存在许多精度/准确度问题,因为涉及到相当多的浮点运算 . 这让我看到了std :: complex和IEEE 754. std :: complex做了大量的工作,特别是处理NaNs . 这是我唯一需要担心成为“IEEE 754兼容”的东西吗?更一般地说,是否存在如何将一个天真的数字库变成符合“IEEE 754”的数据库的“秘诀”?
Note :问题不在于编译器是否是IEEE 754,而在于我是否应该采用我自己的算法中的特殊步骤来满足IEEE 754.毕竟,我与编写std :: complex的人处于相同的位置,他们确实采取了额外的步骤,例如对于NaNs .
3 回答
您只需检查库的 Headers
<limits>
常量numeric_limits::is_iec559
(IEC 559与IEEE 754相同),以查看您的C编译器是否已支持IEEE 754 .使算术IEEE兼容不是你的任务,而是编译器的任务 .
你的编译器要么符合IEEE标准,要么不符合IEEE标准(@Paul),你就无能为力了 . 具体来说,你不能使用符合IEEE标准的编译器双算术编写一个不符合IEEE标准的程序(请不要在我这里接受我的话:)) . 这与您很难编写符合ISO / IEC 14882:2011的编译器的非ISO / IEC 14882:2011兼容程序类似 .
然而,这并不能确保程序提供预期的输出并且没有奇怪的操作,包括UB . 这类似于NaN和INF在IEEE 754中发挥作用的地方 . 它们可以为没有明确定义的数学运算(如0/0)或超出范围的运算(如1/0)提供“合理的答案” .
该标准不关心如何在库中处理这些答案(即如何将它们转换为lib用户) . 该标准仅规定了如何在另一个数学运算中使用这些“合理答案”给出另一个“合理答案”的方法 .
您可能对http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf感兴趣(相当艰难的阅读,但值得努力至少 grab 这个想法)
Ps我检查了我的lib <complex>实现(MinGW 4.9.1.32bit)并没有注意到那里有任何NaNs魔法 .
[@Frank:评论8月3日7:38我的上一个回答]
当乘以复数时,NaN可以是 - 使用uploaded by @Frank - PasteBin处的XCode iplementation的表示法的结果:
然后他们(XCode STL作者)玩这些以允许诸如此类的情况
诀窍(最有可能)是将包含INFs和NaNs的值设置为(/ - )1或(/ - )0,以便最终重新计算
结果是
作为适当的 .
这是
ps.> 我没时间深入研究这个问题,以便我可以判断它们的实施情况,但这很可能是合理的 . (这个Math forum link很有帮助,但是我很乐意将它转换成[a bi]复数数字表示法)无论如何,MinGW 4.9.1 . 32位Win实现使此任务保持打开状态,用户应该处理角落案例 . 您可以首先采用MinGW策略,或者如果您知道如何正确处理quaterions代数的极端情况,则可以采用XCode策略 . 在任何情况下,这不再是关于如何使我的C库符合IEEE 754 ...