浮点异常(核心转储)#694457
Posted
技术标签:
【中文标题】浮点异常(核心转储)#694457【英文标题】:Floating point exception (core dumped) #694457 【发布时间】:2018-10-19 10:07:16 【问题描述】:我不太了解C++,也不明白为什么会出现这个错误: 浮点异常(核心转储)
我不知道该如何解决。
#include <iostream>
using namespace std;
int main()
int a = 251;
int b = 0;
while (a > 0)
a = a / 10;
b++;
int c = 2;
int d = 1;
while (c <= b)
d = d * 10;
c++;
cout << d;
int answer = 0;
int f = d;
int g = 1;
float help;
while (b > 0)
help = (a / (d * g)) *(d / f);
answer = answer + (int)help;
a = a % (d * g);
g = g * (1 / 10);
f = f * (1 / 10);
b--;
cout << answer;
return 0;
【问题讨论】:
猜测g
或f
变为0,这会让你除以零。
可能help
会溢出足够小的f
值。使用调试器逐步找出答案。
Stop it!!!
【参考方案1】:
与直觉相反,“浮点异常”是当您尝试执行整数除以零时由您的 CPU 和/或操作系统抛出的异常。
C++ 使这个操作未定义;您的计算机完全禁止它。
在使用调试器单步执行程序时检查所有变量,并记住1 / 10
是零,而不是 0.1,因为它是整数除法。 (此错误会传播到循环的下一次迭代,您会尝试将此零值用作除数。)
浮点数除以零的定义更明确,ISTR 会剔除特殊值 inf。
【讨论】:
【参考方案2】:每当您“转储核心”时,您都可以使用 GDB 来调查您的崩溃:gdb binary core
。以下是您的代码中发生的情况:
Program terminated with signal SIGFPE, Arithmetic exception.
#0 (...)
at (...):LINE_NUM
LINE_NUM help = (a /(d * g)) *(d /f);
在第二次迭代期间,您的 f
和 g
已经等于 0。在 Linux 中,您可以捕获 SIGFPE
信号并处理错误,或者您可以在执行除法之前检查代码中的变量。
【讨论】:
【参考方案3】:As answered here
更好的使用:
g = g/10;
f = f/10;
对于整数值。 除法前还要检查 g 和 f 是否不等于 0。
我希望这会有所帮助;)
【讨论】:
以上是关于浮点异常(核心转储)#694457的主要内容,如果未能解决你的问题,请参考以下文章