首页 文章

如何使我的C库符合IEEE 754

提问于
浏览
1

我已经编写了一个小型库(在C 11中)来计算四元数,但我很快意识到存在许多精度/准确度问题,因为涉及到相当多的浮点运算 . 这让我看到了std :: complex和IEEE 754. std :: complex做了大量的工作,特别是处理NaNs . 这是我唯一需要担心成为“IEEE 754兼容”的东西吗?更一般地说,是否存在如何将一个天真的数字库变成符合“IEEE 754”的数据库的“秘诀”?

Note :问题不在于编译器是否是IEEE 754,而在于我是否应该采用我自己的算法中的特殊步骤来满足IEEE 754.毕竟,我与编写std :: complex的人处于相同的位置,他们确实采取了额外的步骤,例如对于NaNs .

3 回答

  • 1

    您只需检查库的 Headers <limits> 常量 numeric_limits::is_iec559 (IEC 559与IEEE 754相同),以查看您的C编译器是否已支持IEEE 754 .

  • 0

    使算术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魔法 .

  • 0

    [@Frank:评论8月3日7:38我的上一个回答]

    当乘以复数时,NaN可以是 - 使用uploaded by @Frank - PasteBin处的XCode iplementation的表示法的结果:

    __x is NaN if any of __a, __b, __c, __d is Nan or
    __ac == +INF && __bd == +INF or
    __ac == -INF && __bd == -INF or
    __a == (+/-)INF && __c == 0 or *vice versa* or
    __b == (+/-)INF && __d == 0 or *vice versa* or
    
    __y is NaN if any of __a, __b, __c, __d is Nan or
    __ad == -INF && __bc == +INF or
    __ad == +INF && __bc == -INF or
    __a == (+/-)INF && __d == 0 or *vice versa* or
    __b == (+/-)INF && __c == 0 or *vice versa* or
    

    然后他们(XCode STL作者)玩这些以允许诸如此类的情况

    (INF + INFi)*(c + di)
    (INF + INFi)*(0 + 0i)
    etc...
    

    诀窍(最有可能)是将包含INFs和NaNs的值设置为(/ - )1或(/ - )0,以便最终重新计算

    if (__recalc)
    {
        __x = _Tp(INFINITY) * (__a * __c - __b * __d);
        __y = _Tp(INFINITY) * (__a * __d + __b * __c);
    }
    

    结果是

    INF * (+/-)INF = (+/-)INF or
    INF * (+/-)0   = NaN
    

    作为适当的 .

    这是

    如何将它们转换为lib用户

    ps.> 我没时间深入研究这个问题,以便我可以判断它们的实施情况,但这很可能是合理的 . (这个Math forum link很有帮助,但是我很乐意将它转换成[a bi]复数数字表示法)无论如何,MinGW 4.9.1 . 32位Win实现使此任务保持打开状态,用户应该处理角落案例 . 您可以首先采用MinGW策略,或者如果您知道如何正确处理quaterions代数的极端情况,则可以采用XCode策略 . 在任何情况下,这不再是关于如何使我的C库符合IEEE 754 ...

相关问题