获取错误浮点异常:8

时间:2013-02-01 02:08:25

标签: c++

我不知道为什么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;
}

3 个答案:

答案 0 :(得分:18)

const long number = 600851475143;

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

请参阅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;
}

答案 1 :(得分: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

答案 2 :(得分:0)

对我来说,在制作产品时检查整数溢出时会出现此错误:

#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) > abs(INT_MAX)恰好在out=-1时,条件INT_MIN/out导致int溢出(由于0,所以没有足以容纳INT_MAX+1中的int)。我添加了一个新条件来解决浮点问题:out == -1 && (x > INT_MAX || x <= INT_MIN)