问题标签 [floating-point-exceptions]

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 投票
1 回答
999 浏览

sse - 使用 AVX 指令的程序非常慢

我正在尝试使用 AVX 内在函数编写几何平均 sqrt(a * b),但它的运行速度比糖蜜慢!

这个谜团的关键在于我使用的是 Intel ICC 11,并且在使用 icc -O3 sqrt.cpp 编译时它只会很慢。如果我用 icc -O3 -xavx sqrt.cpp 编译,那么它的运行速度会快 10 倍。

但是是否发生仿真并不明显,因为我使用了性能计数器,并且为两个版本执行的指令数大约为 4G:

------------------------------------ 使用 -xavx------------ ----------------------------

是否正在进行某种处理器内部仿真?我知道非正规数,加起来最终比正常慢 64 倍。

0 投票
0 回答
1402 浏览

visual-studio - 如何在 Visual Studio Native C++ 中 100% 禁用浮点异常

在我为一个线程添加代码以通过 COM 接口(使用 CoInitalize 和相关函数)访问 Windows 管理信息 (WMI) 中的属性后,我的多线程本机 C++ 应用程序引发 INEXACT 浮点异常 (FPE)。在这个添加的代码(据我所知)中没有任何地方明确使用算术。它只是从 WMI 中检索一个字节值。

事实上,异常不是发生在 WMI 中,而是发生在线程的另一个不相关部分中,确实发生了 INEXACT 浮动操作。但是,如果我更改执行流程以跳过 WMI 代码,那么即使在操作相同的数值时,那些具有浮点运算的相同代码块也不会产生异常。

我试图通过执行以下操作来阻止异常:

  • 验证原始浮点模型是 /fp:precise。
  • 显式设置 /fp:except- 编译器选项以禁用 FPE 异常

以上没有效果——异常继续。

  • 插入 _clearfp() 后跟 _controlfp_s() 函数,在尝试任何浮点运算之前清除和屏蔽 FP 异常。

这阻止了异常。好的。

然而,这带来了必须记住保留并将这种特殊处理应用于所有进行浮点运算的地方的负担。不好。

有没有办法让 Visual Studio 中的禁用选项(即 /fp:except-)生效?如果没有,是否有另一个全局选项或方法可以禁用浮点异常,而无需使用 clearfp/controlfp 识别和保护每个浮点操作?

0 投票
3 回答
29040 浏览

c - 浮点异常(核心转储)

我有一个很长的程序,它由一个头文件和两个源文件组成,在第一个文件中我编写了函数的实现,在第二个(这是我的主要文件)中,我调用并执行它们。虽然,有一次我收到一条错误消息说

浮点异常(核心转储)

程序停止。

正如我所说,有很多代码行,因此,我无法在此处发布我的整个源代码,尽管我将发布最相关的部分以及发生错误的位置。

当我尝试调用此函数时发生错误(您可以在下面找到它的实现):

在本例中,Complex 是我定义的类型定义。

这是调用此函数的主要部分。

我之前调用了一些其他函数,它将值放入 fft_input 和 ifft_bpsk_output,它们都是具有 64 个元素的复杂数组。

0 投票
2 回答
1827 浏览

c++ - 在混合 C/Fortran 代码中捕获浮点异常

我很抱歉问了一个以前被问过很多次的问题。但是经过几次搜索,我意识到我可能对如何在 C/C++ 中处理 FPE 与如何在 Fortran 中处理它们之间存在根本性的误解。

在 Fortran(准确地说是 GNU fortran)中,如果想要捕获浮点异常(例如使用 NAN),编译器标志 -ffpe-trap=invalid 可以解决问题。一旦执行了违规语句,就会引发浮点异常。

然而,在 C (GNU gcc) 中,情况似乎并非如此。更令人讨厌(但也许并不奇怪)是相同的 fortran 代码,当从 C 主程序调用时不会引发异常(并停止执行),而当从 Fortran 主程序调用时会引发异常。这似乎与是否使用 C 或 gfortran 链接器无关。

经过大量搜索和阅读,我发现 fenv.h 中提供了 C/C++ 功能,这表明了处理异常的“C 方式”。我看到我可以设置异常标志,然后检查是否引发了异常。我可以看到这种方法如何为异常处理方式提供更多灵活性。这是在 C 中处理异常的“最佳实践”方式吗?对于科学编程(通常使用 C 来调用 fortran 代码),必须对可能发生异常的位置有一些高级知识似乎很不方便。

C 语言中是否没有(直接的)方法可以让代码在第一次出现异常时停止?或者当涉及到 C 中的异常处理时,我还没有完全掌握另一种范式吗?

0 投票
0 回答
227 浏览

c++ - 多线程应用程序中的浮点异常

浮点状态字是否在每个线程或每个进程的基础上工作?

我有一个为 x86 32 位编译的程序,它在代码中的几个点调用

在代码中的几个点。我试图弄清楚在多线程应用程序时这是否会导致问题。我发现一些信息说 fp 控制字在每个线程的基础上工作但在 fp 状态字上找不到任何东西。如果 fp 状态字不是基于每个线程,我担心 fp 异常可能会出现在“错误”线程中。

0 投票
1 回答
2604 浏览

assembly - 使用 div 指令的 x86 NASM 程序集中的浮点异常

我有一个任务,我必须输入一个数字,并找出所有质数,但不超过该数字。例如,如果我在程序中输入 9,它应该打印 3、5 和 7。

我确定一个数字是否为素数的计划是将其除以 2 并检查余数是否为 0。如果余数为 0,则程序从被除数中减去 1,然后循环回到顶部以再次除法。如果余数 != 0 则将其打印到屏幕上,并再次减少股息。这种情况会一直发生,直到被除数为 0。只是这不是正在发生的事情,无论出于何种原因,每当我使用该DIV指令时,我总是会遇到浮点异常,我似乎无法弄清楚为什么或如何解决它。有人对我如何解决这个问题有任何想法吗?

0 投票
1 回答
5375 浏览

c++ - 得到错误:浮点异常

我是一名新手编码员,目前正在解决 Usaco 培训问题以提高我的技能。这是我的“贪婪送礼者”代码。当我提交代码时,我收到一条错误消息:执行错误:您的程序 (`gift1') exited with signal #8 (floating point exception [通常由访问内存超出范围引起])。程序在信号发出前运行了 0.000 CPU 秒。它使用了 3504 KB 的内存。“我一直在查看我的代码并尝试修复此错误一段时间。有人可以帮忙吗?请不要生我的气,因为这是我第一次发帖,就像我说的那样,我是全新的编程。

0 投票
1 回答
122 浏览

floating-point - fegetenv() 清除 x86_64-linux 上的异​​常掩码

让我们采取以下程序:

我希望它输出“0 1 1 1”:即,一旦我启用FE_INVALID异常,对 的调用fegetenvfesetenv使用相同的环境不应修改它。

这在 i386-linux 上按预期工作,但在 x86_64-linux(在 64 位模式下)上,我得到“0 1 0 1”。也就是说,调用fegetenv清除异常掩码

我看不到任何记录它的地方,甚至没有看到 C99 下允许的行为。我可以在glibc-2.5和glib-2.13下确认。

有人可以在最近的 glibc 上对其进行测试吗?我认为这是一个错误是正确的吗?

0 投票
1 回答
216 浏览

c++ - VS2010 中的浮点自省 - 如何在不中断的情况下进行检查?

我已经绕着这里的房子走了一圈,我以为我找到了解决办法。它似乎可以正确识别我所知道的问题,但也会导致大约一半的系统测试用例出现无法解释的崩溃。

问题是我们的代码需要调用客户端代码作为dll。我们可以控制我们的代码,但不能控制客户的代码,经验表明他们的代码并不总是完美无缺的。我已经通过退出程序并清楚地说明可能出了什么问题来防止分段错误,但是我也有一些来自客户端代码的除零异常,我想识别和然后退出。

我一直想做的是:

  1. 就在运行客户端的 dll 之前,打开浮点自检。
  2. 运行客户端代码。
  3. 检查是否有任何问题。
  4. 关闭内省以提高速度。

理论上有很多方法可以做到这一点,但很多方法似乎不适用于 VS2010。

我一直在尝试使用 floating_point pragma:

这在理论上应该没问题,实际上它在 50% 的时间内运行良好。

我认为问题可能是 float_point 控件保持打开状态,并导致代码中的其他地方出现问题。

根据 microsoft.com:

“/fp:precise、/fp:fast、/fp:strict 和 /fp:except 开关在逐个文件的基础上控制浮点语义。float_control pragma 在逐个函数的基础上提供这种控制。”

但是,在编译期间,我收到警告:

警告 C4177:#pragma 'float_control' 只能在全局范围或命名空间范围内使用

从表面上看,这是一个直接的矛盾。

所以我的问题是:

  1. 文档是否正确,还是警告(我打赌警告)?
  2. 有没有可靠和安全的方法来做到这一点?
  3. 我应该这样做,还是太危险了?
0 投票
3 回答
798 浏览

logarithm - 用对数解决浮点错误?

我正在尝试为正整数编写一个基本数字计数器(输入一个整数并输出该整数的位数)。这是我的通用公式:

我尝试dig(x)在 Ruby 中实现等价物,发现当我计算时dig(1000)我得到 2 而不是 3,因为Math.log返回 2.9999999999999996,然后将被截断为 2。处理这个问题的正确方法是什么?(我假设无论用于实现此方法的语言如何,都会发生此问题,但如果不是这种情况,请在您的答案中解释)。