[英]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.有溢出,长不能容纳那么大的数字。
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, i
从0
开始
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 long
或long 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 位,是long
和long
两倍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.