问题标签 [sigfpe]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
514 浏览

c++ - C++设置浮点异常环境

我正在努力尝试以便携式方式设置 std::fenv 。

基于这个cppreference 页面,似乎fesetexceptflag(const std::fexcept_t*,int)应该可以帮助我解决问题。另一方面,我发现 GNU 也提供了这个feenableexcept(int)功能。我的理解是feenablexceptGNU 特定的,虽然我很可能总是可以访问 GNU 的东西,但我希望只使用 std 的东西,也就是说,坚持使用fesetexceptflag. 我写了一个小测试,发现该feenableexcept方法有效,而该方法fesetexceptflag无效。这是两个例子。交换 main 开头的两行注释,得到版本 1 ( fesetexceptflag) 和版本 2 ( feenableexcept):

版本 1 输出:

版本 2 输出:

因此,似乎版本 1 在 fenv 中正确设置了异常标志,但未能引发 SIGFPE,而版本 2 未设置异常标志,但确实引发了 SIGFPE。这里发生了什么事?我是否误解了 的文档fesetexceptflag?我的理解是,它会抓取第一个 arg 中在第二个 arg 中处于活动状态的所有位,并将它们放入 fenv 中(这似乎正在发生)。但是,它似乎无效。另一方面,版本 2 具有 0 掩码 fenv,但成功提高了 SIGFPE。我很困惑。

我在 linux 机器(Red Hat)上使用 gcc 8.2.0,如果有帮助的话。

0 投票
0 回答
120 浏览

c++ - 可收费的,除非不是永久的

我可以使用 feenableexcept() 来更改 FPE 环境。然而,两行代码之后,我的 control_word 发生了一些变化。有没有人见过这个并且知道如何阻止它?

问题可能是多个线程运行程序吗?有没有办法设置默认的 control_word 位,这样它们就不会被覆盖?

我有一个简单的 C++ 程序,它 1) 循环 FPE 方程,2) 捕获 SIGFPE 并打印一些有用的信息,3) 使用 uc_mcontext.fpregs->mxcsr 清除 FPU 状态字,4) 计算有问题的运算符长度然后跳过那个运营商。这样程序可以在不退出的情况下继续运行。

对于最后一次运行,我指定了 feenableexcept(FE_DIVBYZERO); 它似乎在一开始就起作用,但随后某些东西改变了标志并开始捕获其他 FPE。下面是程序输出:

0 投票
1 回答
526 浏览

floating-point - 如何避免未使用的 SIMD 通道中的浮点异常

我喜欢在启用浮点异常的情况下运行我的代码。我在 Linux 下使用:

到目前为止,一切都很好。

我遇到的问题是,有时编译器(我使用 clang8)决定使用 SIMD 指令进行标量除法。好吧,如果这样更快,即使是单个标量,为什么不呢。

但结果是 SIMD 寄存器中未使用的通道可能包含零。

并且在执行 SIMD 除法时,会抛出一个浮点异常。

这是否意味着如果您允许编译器使用 sse/avx 扩展,则根本不能使用浮点异常?

就我而言,这行 C 代码:

...执行为:

然后抛出一个:

0 投票
1 回答
122 浏览

c - sqrtf() 引发域错误,即使我防范负数

我正在对 3D 向量进行规范化,并且 clang-9 生成的代码会在 SIGFPE 上抛出一个 SIGFPE,sqrtf()即使我在调用它之前进行了测试。

请注意,我在启用 FP 异常的情况下运行。

哪个 clang-9 为:

SIGFPE 显示此调用堆栈:

SIGFPE 似乎在 __kernel_standard() 调用中,并且由 0 除以 0 引起。

如果我在其中查找类型“126”,__kernel_standard()那么我看到它是:sqrtf(negative),并且调用了以下代码:

...在调试器中导致此调用堆栈:

问题发生在clang-9 -O3,但不会发生在clang-9 -O0参数上。

我使用的完整命令行:

为什么clang计算负数的sqrt?它是否试图进行推测执行,并根据lensq > FLT_EPSILON测试混合结果?这甚至有效吗?

0 投票
1 回答
209 浏览

c++ - SIGFPE,具有明确除法的算术异常

我有以下一段 C++ 代码:

我正在使用激活了 -fp-trap=all 标志的 intel c++ 编译器。通过 gdb 运行代码时,出现以下错误:

我真的不明白发生了什么。分工似乎很明确。

0 投票
2 回答
281 浏览

c - C中的下溢和nan有什么区别?

目前我正在学习浮点异常。我正在编写一个带有函数的循环。在该函数中,计算出的值等于0.5。随着循环的进行,输入值除以10

循环:

功能:

输出的前几次迭代大约是0.5,后来它变成了0CC。过了一会儿,这是程序的输出:

我想知道从下溢到NaN. 因为下溢意味着数字太小而无法存储在内存中。

但如果数量已经太少,那么目标是NaN什么?

0 投票
2 回答
201 浏览

c++ - 如何生成始终触发信号 SIGFPE(div by zero) 的代码?

我需要编写一个应该始终触发除以零信号(SIGFPE)的单元测试,这样我就可以测试和比较有/没有我的信号捕获模块会发生什么。

我的 Linux 信号捕捉/恢复模块已经开发完成,并按预期工作。当我为模块编写单元测试时,我遇到了一个小麻烦。

这些是 UT 代码(通过 GTest):

如果所有代码都在调试模式下构建,则没有问题。但是除法操作会在 Release 模式下被优化,因此 SIGFPE 信号永远不会被触发!

为了保持产品代码和测试代码之间的一致性,我必须在发布产品时将它们全部构建为发布模式。

如何编写一段总是触发信号 SIGFPE 的代码?

如果存在更“实际”的方法,我不想使用 raise() 函数,因为我想实际触发 SIGFPE 信号。

谢谢!请原谅我糟糕的英语!

0 投票
0 回答
92 浏览

fortran - Fortran 90 GDB 信号 SIGFPE,算术异常

我正在尝试使用 GDB 进行调试,并且在尝试比较两个值时遇到算术错误。

第一个值在模块顶部设置为双精度,参数,public :: Dint = -1.D99

第二个值恰好是被调用子例程中的 inta = 102。

比较发生在子程序中,如 If (Inta /= int(Dint)) then

我尝试通过键入 p Dint 来查看 Dint 的值,但它说它不在当前上下文中。我怀疑它可能已被优化,或者可能需要某种语法才能在模块顶部查看变量。

我还怀疑尝试将此双精度转换为整数时可能存在问题,但我认为它在其他情况下也有效。

任何见解都可能会有所帮助。

0 投票
0 回答
79 浏览

c - 测试 FPE 和陷阱 FPE 有什么区别?

目前我正在学习浮点错误。在幻灯片中,我从提及测试和诱捕中学习。这表明两者之间有明显的区别。不幸的是,我还没有发现有什么区别。

在同一张幻灯片上还有一个问题,为什么它没有被默认启用。

由于电晕我无法问讲师,如果这个问题是微不足道的,很抱歉。

问题:

  • 捕获和测试 FPE 有什么区别?
  • 为什么默认情况下并不总是启用 FPE 测试或捕获?

0 投票
1 回答
69 浏览

c++ - 为什么 clEnqueueNDRangeKernel 会因浮点异常而崩溃?

clEnqueueNDRangeKernel()我正在尝试使用, 从 C++ 程序中启动某个内核。但是,它没有入队或返回错误,而是得到一个浮点异常信号 (SIGFPE)。

由于 IP 原因,我无法深入探讨,我很难提供触发此信号的示例。但是 - 发生这种情况似乎没有任何正当理由。是否存在该函数本身实际执行无效浮点运算的已知案例?