| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 64 人关注过本帖
标题:C语言检测计算产生subnormal值的函数是什么?
只看楼主 加入收藏
lchydp
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-5-4
收藏
 问题点数:5 回复次数:2 
C语言检测计算产生subnormal值的函数是什么?
大家好!在《C Primer Plus》中,作者提到,浮点数的运算可能会产生下溢(underflow),如果精度丢失,就会产生低于正常值(subnormal)的计算结果。并说明了C语言提供了检查计算是否会产生subnormal值的函数。但并未说明是哪个函数。我查到
https://cloud.
,按照这篇文章测试。如果运算产生了上溢和下溢,并未匹配到对应的宏。
程序代码:
#include <stdio.h>
#include <math.h>
#include <float.h>
#include <fenv.h>

#pragma STDC FENV_ACCESS ON
void show_fe_exceptions(void)
{
    int result;
    printf("exceptions raised:");
    if (result = fetestexcept(FE_DIVBYZERO))
    {
        printf(" FE_DIVBYZERO\n");
        printf("result = %d\n", result);
    }
    else if (result = fetestexcept(FE_INEXACT))
    {
        printf(" FE_INEXACT\n");
        printf("result = %d\n", result);
    }
    else if (result = fetestexcept(FE_INVALID))
    {
        printf(" FE_INVALID\n");
        printf("result = %d\n", result);
    }
    else if (result = fetestexcept(FE_OVERFLOW))
    {
        printf(" FE_OVERFLOW\n");
        printf("result = %d\n", result);
    }
    else if (result = fetestexcept(FE_UNDERFLOW))
    {
        printf(" FE_UNDERFLOW\n");
        printf("result = %d\n", result);
    }
    else
    {
        printf(" no above expections\n");
        printf("result = %d\n", result);
    }
    feclearexcept(FE_ALL_EXCEPT);
    printf("\n");
}

int main(void)
{
    printf("MATH_ERREXCEPT is %s\n\n",
        math_errhandling & MATH_ERREXCEPT ? "set" : "not set");
    
    float toobig = 3.4E38 * 100.0f;
    printf("toobig = %e\n", toobig);///< 未产生上述异常,输出inf
    show_fe_exceptions();

    float toosmall = 1.0 * 3.4E-65565;
    printf("toosmall = %e\n", toosmall);///< 未产生上述异常,输出0.000000e+00
    show_fe_exceptions();

    return 0;
}

请问这是为什么呢?C语言检测计算产生subnormal值的函数究竟是哪个呢?

[此贴子已经被作者于2021-5-4 18:54编辑过]

搜索更多相关主题的帖子: printf 函数 result C语言 计算 
3 天前 18:48
lchydp
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-5-4
收藏
得分:0 
另外,上述文章中的宏FE_DIVBYZERO不知道什么时候能匹配到。如果除法的分母为0,是不能通过编译的,而分母是接近于0的数,也不能产生这个异常
程序代码:
#include <stdio.h>
#include <math.h>
#include <float.h>
#include <fenv.h>

#pragma STDC FENV_ACCESS ON
void show_fe_exceptions(void)
{
    int result;
    printf("exceptions raised:");
    if (result = fetestexcept(FE_DIVBYZERO))
    {
        printf(" FE_DIVBYZERO\n");
        printf("result = %d\n", result);
    }
    else if (result = fetestexcept(FE_INEXACT))
    {
        printf(" FE_INEXACT\n");
        printf("result = %d\n", result);
    }
    else if (result = fetestexcept(FE_INVALID))
    {
        printf(" FE_INVALID\n");
        printf("result = %d\n", result);
    }
    else if (result = fetestexcept(FE_OVERFLOW))
    {
        printf(" FE_OVERFLOW\n");
        printf("result = %d\n", result);
    }
    else if (result = fetestexcept(FE_UNDERFLOW))
    {
        printf(" FE_UNDERFLOW\n");
        printf("result = %d\n", result);
    }
    else
    {
        printf(" no above expections\n");
        printf("result = %d\n", result);
    }
    feclearexcept(FE_ALL_EXCEPT);
    printf("\n");
}

int main(void)
{
    printf("MATH_ERREXCEPT is %s\n\n",
        math_errhandling & MATH_ERREXCEPT ? "set" : "not set");
    
    /*printf("0.0/0.0 = %f\n", 0.0 / 0.0);///< 编译不能通过,错误:C2124,被零除或对零求模
    show_fe_exceptions();

    printf("1.0/0.0 = %f\n", 1.0 / 0.0);///< 编译不能通过,错误:C2124,被零除或对零求模
    show_fe_exceptions();*/

    printf("0.0/DBL_MIN = %f\n", 0.0 / DBL_MIN);///< 未产生上述异常,0.0/DBL_MIN = 0.000000
    show_fe_exceptions();

    printf("0.0/(DBL_MIN * -1) = %f\n", 0.0 / (DBL_MIN * -1));///< 未产生上述异常,0.0/(DBL_MIN * -1) = -0.000000
    show_fe_exceptions();

    return 0;
}


[此贴子已经被作者于2021-5-4 18:54编辑过]

3 天前 18:53
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:409
帖 子:7942
专家分:46569
注 册:2011-1-18
收藏
得分:0 
https://en.

上面链接的代码,我试过,可以
3 天前 19:46
快速回复:C语言检测计算产生subnormal值的函数是什么?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.095625 second(s), 9 queries.
Copyright©2004-2021, BCCN.NET, All Rights Reserved