简体   繁体   English

获取错误浮点异常:8

[英]Getting the error floating point exception: 8

I have no idea why g++ doesn't like my code.我不知道为什么 g++ 不喜欢我的代码。 It ran fine in java.它在java中运行良好。 Any insights would be greatly appreciated.任何见解将不胜感激。

#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;
}
const long number = 600851475143;

There is overflow, long can't hold that big number.有溢出,长不能容纳那么大的数字。

see this link看到这个链接

LONG_MAX is 2147483647

try:尝试:

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

Edit:编辑:

You can't % against 0, i starts from 0你不能 % 反对 0, i0开始

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

} }

Minor change to a working version:对工作版本的小改动:

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;
}

I don't see a floating point anywhere, but if I had to guess it's because it's due to overflow.我在任何地方都没有看到浮点数,但如果我不得不猜测是因为它是由于溢出。 Use unsigned long long or long long instead of regular long .使用unsigned long longlong long代替常规的long

sizeof(long) on some compilers has evaluated to 4, similar to sizeof(int) , which means that the limit of long is 2147483647. long long is required by the C++ standard to be at least 64-bits, double that of long and int , which has a signed maximum of 9223372036854775807.某些编译器上的sizeof(long)计算结果为 4,类似于sizeof(int) ,这意味着long的限制为 2147483647。 C++ 标准要求long long至少为 64 位,是longlong两倍int ,其有符号最大值为 9223372036854775807。

The error stems from your code: You're doing modulus by zero, which is wrong.错误源于您的代码:您将模数为零,这是错误的。

Consider doing this instead:考虑这样做:

#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;
}

Notice how i = 0 was changed to i = 1注意如何将i = 0更改为i = 1

For me, this bug came up when checking for integer overflow when doing a product:对我来说,在做产品时检查整数溢出时出现了这个错误:

#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;
}

The issue is that because abs(INT_MIN) > abs(INT_MAX) , exactly when out=-1 , the condition INT_MIN/out was causing an overflow of int (because of 0 , there's not enough room to fit INT_MAX+1 in int ).问题是因为abs(INT_MIN) > abs(INT_MAX) ,正是当out=-1 ,条件INT_MIN/out导致int溢出(因为0 ,没有足够的空间来容纳INT_MAX+1 in int ) . I added a new condition to fix the floating point issue: out == -1 && (x > INT_MAX || x <= INT_MIN)我添加了一个新条件来解决浮点问题: out == -1 && (x > INT_MAX || x <= INT_MIN)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM