【问题标题】:Floating point equation checking ansi c - isnormal()浮点方程检查 ansi c - isnormal()
【发布时间】:2016-03-14 01:20:08
【问题描述】:

我正在尝试检查我在 c99 中的浮点运算。

我应该在 isnormal() 中执行所有操作吗?这段代码有意义吗?

double dTest1 = 0.0;
double dTest2 = 0.0;
double dOutput = 0.0;

dTest1 = 5.0;
dTest2 = 10.3;
dOutput = dTest1 * dTest2;

//add some logic based on output
isnormal(dOutput);

【问题讨论】:

    标签: c error-handling floating-point c99


    【解决方案1】:

    您对isnormal 的使用看起来不像是惯用语。我不确定您对以这种方式使用isnormal 的确切期望(5.0*10.3 显然是正确的,我希望编译器会对其进行优化),但假设您使用它,这里至少有一些明显的问题对于其他计算:

    零是不正常的,因此您不应该使用isnormal 来检查可能为零的结果。

    isnormal 不会告诉您您的计算是否如此接近于零以至于它失去了精度(低于正常范围)并稍后回到正常范围。

    FPU 异常可能会更好地为您服务:对于每个可能的事件,您可能想知道它是否在您启动计算后发生,并且使用它们的方式在this existing answer 中进行了概述。

    【讨论】:

    • 我的编译器没有 FPU 异常。我应该根据浮点运算的类型使用不同的错误检查吗?如果我认为一个大数要除以一个小数,我应该检查下溢吗?如果我将两个大数相乘,我应该检查是否溢出?
    • @CodeSlapper 对于你知道的非零值的单次乘法,在结果上使用isnormal 可以很好地检查结果的准确性是否良好。但它很昂贵:isnormal 可能比乘法本身花费更多。我推荐异常的原因是你可以只在一长串操作结束时检查它们,并确定所有操作都按计划计算,这样更具可读性和效率。
    猜你喜欢
    • 2023-03-02
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    相关资源
    最近更新 更多