【问题标题】:Getting the error floating point exception: 8获取错误浮点异常:8
【发布时间】:2020-05-17 17:08:13
【问题描述】:

我不知道为什么 g++ 不喜欢我的代码。它在java中运行良好。任何见解将不胜感激。

#include<iostream>

using namespace std;

bool isPrime(long number);

int main(){
const long number = 600851475143;
long max = 0;
for(long i= 0; i*i <= number; i++)
    if(number % i == 0 && isPrime(i))
        max = i;
cout<< max << endl;

return 0;
}

bool isPrime(long number){
if(number <= 1) return false;
if(number == 2) return true;
if(number % 2 == 0) return false;

for(long     i= 3; i*i <= number; i+=2)
    if(number % i == 0)
        return false;
return true;
}

【问题讨论】:

  • 只是一个快速说明以备将来使用,当我(很少)除以 0 时,我也遇到了同样的错误。
  • 这实际上是问题所在,尽管它是 % 而不是 /。不过同样的想法。

标签: c++


【解决方案1】:
const long number = 600851475143;

有溢出,long 不能容纳那么大的数字。

this link

LONG_MAX is 2147483647

尝试:

const unsigned long long number = 600851475143;
unsigned long longmax = 0;

编辑:

你不能%反对0,i0开始

for(long i= 0; i*i <= number; i++)
           ^^
{
    if(number % i == 0 && isPrime(i))
               ^^^
{
   max = i;
   cout<< max << endl;
}

}

对工作版本的小改动:

bool isPrime(unsigned long long  number);

int main(){

    const unsigned long long number = 600851475143;
    unsigned long long max = 0;
    for(long i = 1; i*i <= number; i++)
    {
        if(number % i == 0 && isPrime(i))
        {
            max = i;
            cout<< max << endl;
        }
    }
    return 0;
}

bool isPrime(unsigned long long  number)
{
    if(number <= 1) return false;
    if(number == 2) return true;
    if(number % 2 == 0) return false;

    for(unsigned long long i= 3; i*i <= number; i+=2)
    {
        if(number % i == 0)
        {
            return false;
        }
    }
    return true;
}

【讨论】:

  • @JoshHorowitz 什么错误?从字面上看,任何地方都没有浮点数。
  • 啊,你正在对零做一个模数。
【解决方案2】:

我在任何地方都看不到浮点数,但如果我不得不猜测它是因为它是由于溢出造成的。使用unsigned long longlong long 而不是常规的long

sizeof(long) 在某些编译器上已评估为 4,类似于 sizeof(int),这意味着 long 的限制为 2147483647。C++ 标准要求 long long 至少为 64 位,双精度longint 的最大签名数为 9223372036854775807。

错误源于您的代码: 你在做零模,这是错误的。

考虑改为这样做:

#include <iostream>

using namespace std;

bool isPrime(unsigned long long number);

int main(){
    const unsigned long long number = 600851475143;
    unsigned long long max = 0;
    for(unsigned long long i= 1; i*i <= number; i++)
        if(number % i == 0 && isPrime(i))
            max = i;
    cout<< max << endl;

    return 0;
}

bool isPrime(unsigned long long number) {
    if(number <= 1) return false;
    if(number == 2) return true;
    if(number % 2 == 0) return false;

    for(unsigned long long i= 3; i*i <= number; i+=2)
        if(number % i == 0)
            return false;
    return true;
}

注意i = 0 如何更改为i = 1

【讨论】:

    【解决方案3】:

    对我来说,在做产品时检查整数溢出时出现了这个错误:

    #define INT_MIN -2147483648 // -2^31
    #define INT_MAX  2147483647 //  2^31-1
    
    int out=-1, x=-5;
    
    if ((out > 0 && (x > INT_MAX/out || x < INT_MIN/out)) ||
        (out < 0 && (x < INT_MAX/out || x > INT_MIN/out))) {
      // what to do for overflow
    } else {
      out *= x;
    }
    

    问题是因为abs(INT_MIN) &gt; abs(INT_MAX),恰好在out=-1 时,条件INT_MIN/out 导致int 溢出(因为0,没有足够的空间容纳@987654328 中的INT_MAX+1 @)。我添加了一个新条件来解决浮点问题:out == -1 &amp;&amp; (x &gt; INT_MAX || x &lt;= INT_MIN)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多