非规格化浮点数(nan, inf, subnormal等)的判别和运算

在大规模数学运算中,遇到NaN可能会干扰程序逻辑。0*inf是产生NaN的常见原因。fpclassify()宏用于识别浮点数类型,帮助处理这些特殊情况。
摘要由CSDN通过智能技术生成

大规模数学运算中有时会碰到结果为NaN的情况,由于NaN参与任何比较得到false(这点与inf不同!),将破坏正常的程序逻辑,又因为NaN同任何数做数学运算得到NaN,具有传递性,使得定位非常困难。


NaN产生的最可能的原因是 0*inf ,大多数路径是这样的:

1/subnormal = inf 或 1/0 = inf --> 0 * inf = nan


下面的代码重现了这一过程:

#include <stdio.h>
#include <math.h>
#include <float.h>


int main()
{
    float f = FLT_MIN;
    float r = 1.0/f;
    printf("Normal: f = %e, r = 1/f = %e\n", f, r);


    int subf_i = 0x3;
    f = *(float *)&subf_i;
    r = 1.0/f;
    float mul = r * f;
    printf("Subnormal: f = %e, r = 1/f = %e, f*r = %e, 0*r = %e\n", f, r, mul, 0.0*r);


    return 0;
}

C99提供的 fpclassify() 宏能够判断浮点数的类型,一种典型的应用方法如下:

    for ( i 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值