为SIGFPE设置标志并继续执行忽略FPE

weixin_38063369 2019-09-12 12:20:13
在数值应用程序中,我想知道计算完成后是否发生浮点异常.默认情况下,将以静默方式忽略浮点除法和无效操作. 我的尝试是启用我关心的FPE,通过设置标志来处理SIGFPE并再次禁用它们以允许继续执行: #include <fenv.h> #include <signal.h> #include <stdio.h> int caught = 0; struct sigaction old_sa; /* (2) */ fenv_t fenv_hold; void sighandler() { caught = 1; printf("Caught in handler, disabling\n"); /* (1) */ fedisableexcept(FE_ALL_EXCEPT); /* (2) */ feholdexcept(&fenv_hold); sigaction(SIGFPE, &old_sa, NULL); } int main(void) { struct sigaction sa; volatile double a=1, b=0; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = sighandler; sigaction(SIGFPE, &sa, &old_sa); feenableexcept(FE_DIVBYZERO); printf("Dividing by zero..\n"); a/=b; printf("Continuing\n"); } 我采用了两种方法,第一种用(1)标记,第二种用(2)标记.它们都没有按预期工作. 输出: Dividing by zero.. Caught in handler, disabling Floating point exception (core dumped) 预期产出: Dividing by zero.. Caught in handler, disabling Continuing
...全文
38 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38068392 2019-09-12
  • 打赏
  • 举报
回复
如果您只是想知道,在计算完成后,是否发生了浮点异常,那么您不应该使用信号,因为它们的开销很高.而是使用浮点异常标志,这些标志在正常执行期间由处理器快速设置. 请参阅< fenv.h>上的C标准.简述: >插入#include< fenv.h>在您的源文件中.>在可能访问浮点标志或在非默认浮点模式下运行的任何源代码之前插入#pragma STDC FENV_ACCESS.>如果需要,请在上述源代码之后插入#pragma STDC FENV_ACCESS,此时以下源代码不访问标志或在非默认模式下运行.>在计算之前,执行feclearexcept(FE_ALL_EXCEPT)以清除标志.>计算完成后,执行fetestexcept(例外)以测试标志.异常应该是FE_DIVBYZERO,FE_INEXACT,FE_INVALID,FE_OVERFLOW和/或FE_UNDERFLOW的按位OR,以及可能的其他实现定义标志. 请注意,某些C实现对访问浮点环境的支持较差.

474

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧