问题标签 [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.
c++ - 由于除法语句,C++ 中的浮点异常
我已经搜索了谷歌,但我无法找到我的问题的解决方案。这是我的代码-
我得到浮点异常。我认为错误是由于星号声明而出现的。谁能告诉我可能是什么合理的原因以及如何删除它?
c - 为什么整数除以 -1(负一)会导致 FPE?
我的任务是解释 C 代码(在 x86 上运行)的一些看似奇怪的行为。我可以轻松地完成其他所有事情,但这个真的让我很困惑。
代码片段 1 输出
-2147483648
代码片段 2 不输出任何内容,并给出一个
Floating point exception
我很清楚 Code Snippet 1 ( ) 结果的原因1 + ~INT_MIN == INT_MIN
,但我不太明白整数除以 -1 如何生成 FPE,也不能在我的 Android 手机上重现它(AArch64,GCC 7.2.0)。代码 2 的输出与代码 1 相同,没有任何异常。它是x86 处理器的隐藏错误功能吗?
该作业没有说明任何其他内容(包括 CPU 架构),但由于整个课程基于桌面 Linux 发行版,您可以放心地假设它是现代 x86。
编辑:我联系了我的朋友,他在 Ubuntu 16.04(Intel Kaby Lake,GCC 6.3.0)上测试了代码。结果与指定的任何内容一致(代码 1 输出上述内容,代码 2 与 FPE 一起崩溃)。
c++ - 使用用户定义的函数查找“完美数”时出现浮点异常错误
我必须编写一个程序,在用户给定的特定范围内检查“完美数字”。我做了一个用户定义的函数来检查一个特定的数字是否是一个完美的数字。如果是则返回 1,如果不是则返回 0。然后我使用 if 语句在主程序中打印出完美数字。我遇到的问题是浮点异常错误。我不知道现在该怎么办。我会非常感谢一些帮助。:)。
c++ - GCD代码中的浮点异常
我正在创建一个程序来使用欧几里得方法计算两个数字的 gcd,但我得到了一个浮点异常错误。我应该怎么办?
c - 使用pow时如何避免浮点异常?
我使用一个 C 库,它pow
在两个double
值上使用该函数
目前,我有b = 0.62
and c = 1504
,这意味着a
应该接近 0 (3.6e-312)。
但我有一个浮点异常。如何避免,直接返回0?我们能预料到这种情况吗?
我使用 64 位的 Debian 9,并使用 gcc 6.3 进行编译。该库是ccmaes,这是有问题的行:
https://github.com/CMA-ES/c-cmaes/blob/eda8268ee4c8c9fbe4d2489555ae08f8a8c949b5/src/cmaes.c#L893
我使用了 gdb,所以浮点异常不是来自除法 (t->chiN = 2.74)
如果我尝试使用 FPE 发生时的值来重现它,我没有问题(编译选项:-fopenmp -O3 -DNDEBUG -fPIC -Wall -Wextra -Wno-long-long -Wconversion -o,如库)
结果:1.00000000000
c++ - 如何正确避免 SIGFPE 和算术运算溢出
我一直在尝试创建一个尽可能完整的 Fraction 类,以自学 C++、类和相关的东西。除其他外,我想确保某种程度的“保护”免受浮点异常和溢出。
客观的:
避免常见运算中出现的算术运算中的溢出和浮点异常,消耗最少的时间/内存。如果避免是不可能的,那么至少检测它。
此外,这个想法是不要转换为更大的类型。这会产生一些问题(比如可能没有更大的类型)
我发现的案例:
+、-、*、/、pow、root 上的溢出
操作大多很简单(
a
并且b
是Long
):- a+b:如果 LONG_MAX - b > a 则存在溢出。(还不够。
a
或者b
可能是负面的) - ab:如果 LONG_MAX - a > -b 则存在溢出。(同上)
- a*b:如果 LONG_MAX / b > a 则存在溢出。(如果 b != 0)
- a/b:如果 a << b 可能会抛出 SIGFPE,如果 b << 0 则可能会溢出
- pow(a,b): if (pow(LONG_MAX, 1.0/b) > a 那么有溢出。
- pow(a,1.0/b):类似于 a/b
- a+b:如果 LONG_MAX - b > a 则存在溢出。(还不够。
当 x = LONG_MIN(或等效项)时 abs(x) 溢出
这很好笑。每个有符号类型都有一个范围 [-x-1,x] 的可能值。abs(-x-1) = x+1 = -x-1 因为溢出。这意味着存在 abs(x) < 0 的情况
- 具有大数字的 SIGFPE 除以 -1
应用分子/gcd(分子,分母)时发现。有时 gcd 返回 -1,我得到一个浮点异常。
简单的修复:
- 在某些操作上很容易检查溢出。如果是这种情况,我总是可以转换为 double (有失去大整数精度的风险)。这个想法是找到一个更好的解决方案,而不是强制转换。
在分数算术中,有时我可以进行额外的简化检查:为了解决 a/b * c/d(共素数),我可以先简化为共素数 a/d 和 c/b。
如果询问我可以创建一个函数 neg() 来避免溢出a
orb
是否 <0 或 > 0,我总是可以级联。不是最漂亮的。除了那个可怕的选择,- 我可以采取 gcd 的 abs(x) 和任何类似情况(任何地方 x > LONG_MIN)
我不确定 2. 和 3. 是否是最好的解决方案,但似乎足够好。我在这里发布这些,所以也许有人有更好的答案。
最丑陋的修复
在大多数操作中,我需要做很多额外的操作来检查和避免溢出。这是我很确定我可以学到一两件事。
例子:
避免这些算术运算溢出的最佳方法是什么?
编辑:这个站点中有一些非常相似的问题,但它们并不相同(检测而不是避免,未签名而不是签名,SIGFPE 在特定的不相关情况下)。
检查所有这些我发现了一些答案,这些答案在修改后可能有助于给出正确的答案,例如:
- 检测未签名加法中的溢出(不是我的情况,我正在使用签名):
检测签名操作中的溢出。这可能有点太笼统了,有很多分支,并且没有讨论如何避免溢出。
答案中提到的CERT 规则是一个很好的起点,但再次只讨论如何检测。
其他答案太笼统了,我想知道对于我正在查看的案例是否有更具体的答案。
c - 没有浮点或双变量的浮点异常
我遇到以下代码“浮点异常,核心转储”的问题,但我什至没有一个浮点或双变量。通过检查 printf,我观察到它发生在 isPrimeFunction 中,在那里执行卡住了。
c++ - c++线性散列浮点异常(核心转储)
我知道问题已发布,但不幸的是我无法将答案与我的问题联系起来,所以我会再问一次......
我正在研究线性哈希项目。我的代码基本上应该创建一个动态增长的哈希表。元素存储在固定大小的桶(数组)中,然后表中有更多桶。每个桶都可以有它的溢出桶(当原始桶中没有更多位置时创建)并且每次创建溢出时,所谓的“拆分”都会完成,并且会向表中添加一个桶并重新散列表。还有更多细节,但我认为这些基础知识足以理解我的代码..
所以我有数据结构元素和bucket,bucket有自己的几种方法,插入元素,找到它,创建溢出等。此外,发生其他一切的类是ADS_set,它是一个预先描述的模板类我必须使用的方法。整个事情都与指针一起工作,我有几个用于测试它的测试文件。
当我现在测试代码时,它会编译,但在某些时候它会返回以下错误消息:捕获的信号:浮点异常,并带有提示:方法:插入(迭代器,迭代器)据我所知:
这部分代码适用于使用模的哈希函数,但我看不出这将如何导致浮点异常,因为哈希函数是这样的:
您可以在此处查看其余代码https://pastebin.com/HXeUpaW5,最重要的功能是:
--> findElement(const_reference key) - 第 51-69 行
--> insertElementInTable(const_reference key) - 第 179-197 行调用 createOverflow() 44-49、splitTable() 131-147、rehashAfterSplit() 153-176 和 insertElementInBucket() 72-88
希望您能提供一些新的见解,因为我不知道为什么会出现问题。谢谢!
c++ - 当没有浮点数据类型时,为什么这段代码会出现浮点异常?
我没有除以零,我的代码中没有浮点数据类型,我仍然得到浮点异常。
前面的所有问题都有类似的除以零的问题,但变量 deno 永远不能为零,因为n>=2
。
我之前的研究:
问题陈述:https ://www.hackerrank.com/contests/projecteuler/challenges/euler025/problem
它通过了 2 个测试用例并失败了 2 个。都是隐藏的测试用例。结果图片
通过输入 1 50 我们可以重现错误。细节:
c++ - 在没有太多条件的情况下如何避免除以零?
我有一个整数参数,它应该控制在特定运行中事件发生的次数。
例如,如果每次运行的迭代次数为 1000,那么FREQ
如果我想让事件每 200 次迭代发生一次,则参数将为 5。但是,我希望能够更改迭代次数,但保持比率不变,并且FREQ
如果我根本不希望事件发生,也能够将参数设置为 0。
这是我目前正在使用的:
这很好用,但它不适合我有嵌套的条件,特别是当我有两个很多时doSomething()
,我觉得它应该能够比这更容易完成。
我尝试将一个设置为有条件的if (FREQ > 0 && count < N_ITER/FREQ)
,但显然Floating point exception
因为除以零而抛出了一个。
我也尝试使用 try/catch 块,但就混乱而言,使用嵌套条件确实没有什么不同。这个问题有更优雅的解决方案吗?