7

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

#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
4

1 回答 1

9

在某些平台(例如 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。请注意,即使目标整数类型是无符号的,情况也是如此。

于 2018-07-11T22:31:16.657 回答