当没有 float 数据类型时,为什么这段代码会出现浮点异常?
Why does this code get floating point exception when there is no float data-type?
我没有除以零并且我的代码中没有浮点数据类型,我仍然得到浮点异常。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
unsigned long long int t,n;
cin>>t;
while(t--)
{
cin>>n;
unsigned long long int deno = pow(10,n-1),count=2,sum = 0,f1=1,f2=1;
while(1){
sum = f1+f2;
f1 = f2;
f2 = sum;
count++;
if((int)(sum/deno)>0){
cout<<count<<endl;
break;
}
}
}
return 0;
}
之前所有关于相同的问题都有类似的除以零的问题,但变量 deno 永远不会为零,因为 n>=2
。
我方之前的研究:
问题陈述:https://www.hackerrank.com/contests/projecteuler/challenges/euler025/problem
通过了2个测试用例,失败了2个,都是隐藏测试用例。 Result image
通过输入 1 50 我们可以重现错误。详情:
GDB trace: Reading symbols from solution...done. [New LWP 15127] Core
was generated by `solution'. Program terminated with signal SIGFPE,
Arithmetic exception.
#0 main () at solution.cc:23
23 if((int)(sum/deno)>0){
#0 main () at solution.cc:23
整数除法产生异常是完全正常的,在某些平台上报告为 "floating point exception"(例如 Linux)。您可以轻松地从整数除以零获得它,或者,再举一个例子,通过触发溢出
int i = INT_MIN;
int b = -1;
i = i / b;
http://coliru.stacked-crooked.com/a/07c5fdf47278b696
在某些情况下,此异常可能会出现或消失,具体取决于优化级别。通常只有当编译器决定生成实际的除法指令(而不是优化除法)时才会触发异常。
在您的情况下,使用了无符号整数除法,因此被零除似乎是唯一可能的罪魁祸首。我猜这个
unsigned long long int deno = pow(10,n-1);
恰好导致 deno
为零。 pow
是一个产生浮点结果的浮点函数。如果原始值太大(n
等于 50
的情况),从浮点类型到整数类型的转换会导致未定义的行为。请注意,即使目标整数类型是无符号的也是如此。
我没有除以零并且我的代码中没有浮点数据类型,我仍然得到浮点异常。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
unsigned long long int t,n;
cin>>t;
while(t--)
{
cin>>n;
unsigned long long int deno = pow(10,n-1),count=2,sum = 0,f1=1,f2=1;
while(1){
sum = f1+f2;
f1 = f2;
f2 = sum;
count++;
if((int)(sum/deno)>0){
cout<<count<<endl;
break;
}
}
}
return 0;
}
之前所有关于相同的问题都有类似的除以零的问题,但变量 deno 永远不会为零,因为 n>=2
。
我方之前的研究:
问题陈述:https://www.hackerrank.com/contests/projecteuler/challenges/euler025/problem
通过了2个测试用例,失败了2个,都是隐藏测试用例。 Result image
通过输入 1 50 我们可以重现错误。详情:
GDB trace: Reading symbols from solution...done. [New LWP 15127] Core
was generated by `solution'. Program terminated with signal SIGFPE,
Arithmetic exception.
#0 main () at solution.cc:23
23 if((int)(sum/deno)>0){
#0 main () at solution.cc:23
整数除法产生异常是完全正常的,在某些平台上报告为 "floating point exception"(例如 Linux)。您可以轻松地从整数除以零获得它,或者,再举一个例子,通过触发溢出
int i = INT_MIN;
int b = -1;
i = i / b;
http://coliru.stacked-crooked.com/a/07c5fdf47278b696
在某些情况下,此异常可能会出现或消失,具体取决于优化级别。通常只有当编译器决定生成实际的除法指令(而不是优化除法)时才会触发异常。
在您的情况下,使用了无符号整数除法,因此被零除似乎是唯一可能的罪魁祸首。我猜这个
unsigned long long int deno = pow(10,n-1);
恰好导致 deno
为零。 pow
是一个产生浮点结果的浮点函数。如果原始值太大(n
等于 50
的情况),从浮点类型到整数类型的转换会导致未定义的行为。请注意,即使目标整数类型是无符号的也是如此。