问题标签 [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.
c++ - C++设置浮点异常环境
我正在努力尝试以便携式方式设置 std::fenv 。
基于这个cppreference 页面,似乎fesetexceptflag(const std::fexcept_t*,int)
应该可以帮助我解决问题。另一方面,我发现 GNU 也提供了这个feenableexcept(int)
功能。我的理解是feenablexcept
GNU 特定的,虽然我很可能总是可以访问 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,如果有帮助的话。
c++ - 可收费的,除非不是永久的
我可以使用 feenableexcept() 来更改 FPE 环境。然而,两行代码之后,我的 control_word 发生了一些变化。有没有人见过这个并且知道如何阻止它?
问题可能是多个线程运行程序吗?有没有办法设置默认的 control_word 位,这样它们就不会被覆盖?
我有一个简单的 C++ 程序,它 1) 循环 FPE 方程,2) 捕获 SIGFPE 并打印一些有用的信息,3) 使用 uc_mcontext.fpregs->mxcsr 清除 FPU 状态字,4) 计算有问题的运算符长度然后跳过那个运营商。这样程序可以在不退出的情况下继续运行。
对于最后一次运行,我指定了 feenableexcept(FE_DIVBYZERO); 它似乎在一开始就起作用,但随后某些东西改变了标志并开始捕获其他 FPE。下面是程序输出:
floating-point - 如何避免未使用的 SIMD 通道中的浮点异常
我喜欢在启用浮点异常的情况下运行我的代码。我在 Linux 下使用:
到目前为止,一切都很好。
我遇到的问题是,有时编译器(我使用 clang8)决定使用 SIMD 指令进行标量除法。好吧,如果这样更快,即使是单个标量,为什么不呢。
但结果是 SIMD 寄存器中未使用的通道可能包含零。
并且在执行 SIMD 除法时,会抛出一个浮点异常。
这是否意味着如果您允许编译器使用 sse/avx 扩展,则根本不能使用浮点异常?
就我而言,这行 C 代码:
...执行为:
然后抛出一个:
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
测试混合结果?这甚至有效吗?
c++ - SIGFPE,具有明确除法的算术异常
我有以下一段 C++ 代码:
我正在使用激活了 -fp-trap=all 标志的 intel c++ 编译器。通过 gdb 运行代码时,出现以下错误:
我真的不明白发生了什么。分工似乎很明确。
c - C中的下溢和nan有什么区别?
目前我正在学习浮点异常。我正在编写一个带有函数的循环。在该函数中,计算出的值等于0.5
。随着循环的进行,输入值除以10
。
循环:
功能:
输出的前几次迭代大约是0.5
,后来它变成了0
CC。过了一会儿,这是程序的输出:
我想知道从下溢到NaN
. 因为下溢意味着数字太小而无法存储在内存中。
但如果数量已经太少,那么目标是NaN
什么?
c++ - 如何生成始终触发信号 SIGFPE(div by zero) 的代码?
我需要编写一个应该始终触发除以零信号(SIGFPE)的单元测试,这样我就可以测试和比较有/没有我的信号捕获模块会发生什么。
我的 Linux 信号捕捉/恢复模块已经开发完成,并按预期工作。当我为模块编写单元测试时,我遇到了一个小麻烦。
这些是 UT 代码(通过 GTest):
如果所有代码都在调试模式下构建,则没有问题。但是除法操作会在 Release 模式下被优化,因此 SIGFPE 信号永远不会被触发!
为了保持产品代码和测试代码之间的一致性,我必须在发布产品时将它们全部构建为发布模式。
如何编写一段总是触发信号 SIGFPE 的代码?
如果存在更“实际”的方法,我不想使用 raise() 函数,因为我想实际触发 SIGFPE 信号。
谢谢!请原谅我糟糕的英语!
fortran - Fortran 90 GDB 信号 SIGFPE,算术异常
我正在尝试使用 GDB 进行调试,并且在尝试比较两个值时遇到算术错误。
第一个值在模块顶部设置为双精度,参数,public :: Dint = -1.D99
第二个值恰好是被调用子例程中的 inta = 102。
比较发生在子程序中,如 If (Inta /= int(Dint)) then
我尝试通过键入 p Dint 来查看 Dint 的值,但它说它不在当前上下文中。我怀疑它可能已被优化,或者可能需要某种语法才能在模块顶部查看变量。
我还怀疑尝试将此双精度转换为整数时可能存在问题,但我认为它在其他情况下也有效。
任何见解都可能会有所帮助。
c - 测试 FPE 和陷阱 FPE 有什么区别?
目前我正在学习浮点错误。在幻灯片中,我从提及测试和诱捕中学习。这表明两者之间有明显的区别。不幸的是,我还没有发现有什么区别。
在同一张幻灯片上还有一个问题,为什么它没有被默认启用。
由于电晕我无法问讲师,如果这个问题是微不足道的,很抱歉。
问题:
- 捕获和测试 FPE 有什么区别?
- 为什么默认情况下并不总是启用 FPE 测试或捕获?
三
c++ - 为什么 clEnqueueNDRangeKernel 会因浮点异常而崩溃?
clEnqueueNDRangeKernel()
我正在尝试使用, 从 C++ 程序中启动某个内核。但是,它没有入队或返回错误,而是得到一个浮点异常信号 (SIGFPE)。
由于 IP 原因,我无法深入探讨,我很难提供触发此信号的示例。但是 - 发生这种情况似乎没有任何正当理由。是否存在该函数本身实际执行无效浮点运算的已知案例?