【问题标题】:floating point exception trying to find prime numbers尝试查找素数的浮点异常
【发布时间】:2014-09-04 22:12:41
【问题描述】:

我有一个生成素数的程序。当我想要前 100 和 200 个素数时,此代码工作正常,但每当我使用超过 300 的总值时,就会出现浮点异常。问题似乎出在数组中,但我不明白发生了什么。

#include<stdio.h>

int main()
{
    int total = 500;
    int primes[total];
    primes[0] = 2;
    int max = 1;
    int current = 3;
    int index = 0;
    printf("%d\n",2);
    while(max != total)
    {
        for(index = 0; index <= max + 1; index++)
        {
            if(index == max + 1){
                primes[index] = current;
                printf("%d\n",current);
                max = max + 1;
                current = current + 1;
                break;
            } else {
                if(current % primes[index] == 0){
                    current = current + 1;
                    break;
                }
            }
        }
    }
}

【问题讨论】:

  • 从不说“代码工作正常”。
  • index &lt;= max + 1index == max + 1 错误。
  • 性能小技巧:current = current + 2; 很好,因为所有偶数都不是素数;你可以用if (index == max + 1 || primes[index] * primes[index] &gt; current)之类的东西替换if (index == max + 1)
  • 第一次在for()循环中,index从0变为2。当index == 1if(current % primes[1] == 0)被执行。 primes[1] 从未初始化。

标签: c arrays primes floating-point-exceptions


【解决方案1】:

您必须确保永远不会使用 0primes[index] 值来评估表达式 current % primes[index]0 值作为 % 运算符的右操作数调用 C 中未定义的行为。

【讨论】:

  • 当我运行他的代码时,将数组调整为比总数大 +1 以使数组上的 off by 1 错误,并且总数仅为 500,这永远不会发生,他可以编辑他的代码来解释那个错误
  • @Steve 当index == 1 表达式current % primes[index] 被求值但primes[1] 没有初始化,所以如果值恰好是0,他会得到0 的除法。在您的系统上,primes[1] 可能具有不同的未初始化值。解决此问题的一种简单方法是在程序顶部添加 primes[1] = 3; 之类的内容。
【解决方案2】:

您的访问超出了 primes[] 的末尾,在调试器中您编写 primes[index] 其中 index == 500.. primes[500] 不存在

【讨论】:

  • 我知道您想掩盖我的回答,但请考虑一下,您破坏了您的内存,从可能损坏的内存中读取并对其进行计算,这会导致您的 FP 异常。试试:int total = 501;int primes[500]; 看看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多