浮点异常(核心转储)非常奇怪

Posted

技术标签:

【中文标题】浮点异常(核心转储)非常奇怪【英文标题】:Floating point exception(core dumped) very wierd 【发布时间】:2016-03-26 21:37:47 【问题描述】:

我知道这已经被问过了,但我还没有找到并回答。 这是我的代码:

#include <cstdio>
#include <vector>
using namespace std;

int a[510];

int main()

    int n, p;
    bool rez;
    while(1)
    
        p = 0;
        rez = 1;
        scanf("%d", &n);
        if(n == -1) break;
        for(int i = 0; i < n; i++) scanf("%d", &a[i]);
        // printf("a");
        for(int i = n-1; i >= 0; i--)
        
            if((a[i]+p)%i)
            
                rez = 0;
                break;
            
            p++;
        
        if(rez) printf("S\n");
        else printf("N\n");
    
    return 0;

除测试用例外,所有测试用例都可以正常工作: 4 1 1 3 0 但 4 1 0 3 1 作品。 同样在有问题的测试用例中,我插入了 printf("a"); 但是程序不打印它,这表明问题发生在该行之前。但是,如果我删除其余代码,一切正常。

【问题讨论】:

检查i 此处if((a[i]+p)%i) 是否变为零。 尝试在调试器中单步执行。发生了一些奇怪的事情。你根本没有浮点数 请正确描述您的代码应该做什么,以及有问题的输入是什么。我不知道“测试用例 4 1 1 3 0”是什么意思。是你输入的数字吗,包括空格? 【参考方案1】:

浮点异常不仅会报告浮点错误,还会报告整数除以 0,包括取相对于 0 的模(正如 πάντα-ῥεῖ 在第一条评论中所说)。您的 i 循环确实迭代到零。一旦发生这种情况 - 即当 break 语句没有针对 i 的先前值触发时 - 您将看到浮点异常。

【讨论】:

是啊,我发的时候已经是深夜了,所以当时没注意到,但是为什么oder测试用例执行正常还是很奇怪

以上是关于浮点异常(核心转储)非常奇怪的主要内容,如果未能解决你的问题,请参考以下文章

浮点异常(核心转储)cpp

为啥我会收到“浮点异常(核心转储)”?

为 Linux 创建 C 程序时出现浮点异常(核心转储)

线性同余生成器的浮点异常(核心转储)

在汇编中进行除法时出现浮点异常(核心转储)

Vigenere.c CS50 浮点异常(核心转储)