当没有浮点数据类型时,为什么此代码会出现浮点异常



我没有被零除,而且我的代码中没有浮点数据类型,我仍然得到浮点异常。

#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那样为零。

我方先前的研究:

  1. 不包含浮点的代码中的"浮点异常">
  2. 浮点异常C++为什么以及它是什么

问题陈述:https://www.hackerrank.com/contests/projecteuler/challenges/euler025/problem

它通过了2个测试用例,但失败了2个。所有这些都是隐藏的测试用例。结果图像

在通过输入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

在某些平台(例如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);

恰好导致CCD_ 2中的零。pow是一个产生浮点结果的浮点函数。如果原始值太大(n等于50就是这种情况(,则从浮点类型转换为整数类型会导致未定义的行为。请注意,即使目标整数类型是无符号的,情况也是如此。

相关内容

  • 没有找到相关文章

最新更新