浮点异常 C++ 是什么?为什么会出现这种情况?

48

我正在为欧拉计划问题3构建一个程序,虽然这可能与结果无关,但我现在正试图使这个代码接受一个数字并测试它是否为质数。现在在我开始排除函数故障之前,它给我一个错误提示"浮点异常",紧接着输入数字。以下是代码:

int main()
{
    int input;
    cout << "Enter number: " << endl;
    cin>> input;
    int i = input/2;
    int c;
    for (i>0; i--;) {
        c= input%i;
        if (c==0 || i == 1)
            cout << "not prime" << endl;
        else
            cout << "prime" << endl;
    }
    return 0;
}

那么,它为什么会给我一个浮点异常,这究竟是什么意思?


9
你的for循环出了问题。 - Lazer
浮点异常有很多原因,但取决于你的代码,我同意Pete的看法,认为 c= input%i; 是问题的根源,希望我的答案能帮到你。 - TopDeveloper
5个回答

50

"浮点数"通常是计算机表示非整数的数字的方式--基本上就是带小数点的数字。在C++中,您使用float而不是int来声明它们。浮点异常是当您尝试对浮点数进行不可能的操作时发生的错误,例如除以零。


好的,那么在我尝试修复它之前,让我确保我理解自己的代码。for循环只有在i>0时才会执行,对吗?然后唯一会进行除法运算的时间是c=input%i,所以它永远不会除以0? - samuraiseoul
如果您仔细查看循环,就会发现有一种方式可以使其体在 i == 0 时运行一次。 - Crashworks
是的,这就是 for 循环的全部原因。循环运行,然后执行某些操作(在您的情况下是 i--),然后再次运行循环,直到顶部的条件不再为真。 - Pete
哈哈,是的,我修复了浮点问题后它仍然没有正常工作,但我相信你可以解决它。如果不行,就回帖吧!=) - Pete
31
这个答案是错误的。"浮点异常"这个名称是一个历史上的误称。根据IEEE754标准/附录F,浮点数除以零是有良好定义的,不会产生任何信号。在OP的代码中,它表现为整数除以零的方式,在OP使用的特定实现中它是未定义行为。 - R.. GitHub STOP HELPING ICE
显示剩余3条评论

43
for (i>0; i--;)

可能是错误的,应该改为

for (; i>0; i--)

请注意我放置分号的位置。条件应该放在中间,而不是开头。


是的,但这不是浮点异常的原因。 - Anonymous
12
间接地说,是的。分号的错位导致 i 变成了 0(而条件 i>0 不允许这种情况出现)。 - Ontonator

14

浮点异常有很多原因。看着你的代码,你的for循环似乎有一些“不正确”的地方。可能会出现除以零的情况。

for (i>0; i--;){
c= input%i;

因为你正在递减i,所以在某个点上会出现除以零的情况。


所以for循环第一次自动递减i? - samuraiseoul
我认为你需要利用一些断点,并且更加深入地思考解决方案。你不想让我们只是给你一个可行的答案,对吧? - Pete

9

由于此页面是谷歌搜索“c++浮点异常”的第一个结果,我想补充另一件可能导致此问题的事情:使用未定义的变量。


2
问题出现在代码片段的for循环中:
for (i > 0; i--;)
在这里,您的意图似乎是:如果(i > 0),则进入循环并在完成for循环后将i的值减少一。
它是否像这样工作?让我们看看。
看看for()循环语法:
**for ( initialization; condition check; increment/decrement ) {  
    statements;  
}**

初始化只在循环开始时执行一次。注意您代码片段中的“;”并将其与for循环语法映射。

初始化: i > 0:仅在第一次执行时执行。不会对您的代码产生任何影响。

条件检查: i--:后减少。

              Here, i is used for condition check and then it is decremented. 
              Decremented value will be used in statements within for loop. 
              This condition check is working as increment/decrement too in your code. 

让我们在这里停下来,看一下浮点异常。

什么是浮点异常?一个简单的例子是除以0。你的代码也发生了同样的情况。

当i在条件检查中达到1时,条件检查将被验证为true。
由于后缀递减,当它进入for循环时,i将变为0。

Modulo operation at line #9 results in divide by zero operation.  

有了这个背景知识,您应该能够在for循环中修复问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接