gpt4 book ai didi

c++ - SIGFPE 恶作剧

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:13 26 4
gpt4 key购买 nike

我重复了两次相同的计算,但在一次中我得到了浮点异常,而在另一次中却没有。

#include <iostream>
#include <cmath>
#include <fenv.h>

using namespace std;

int main(void)
{
feenableexcept(-1);

double x,y,z;

x = 1.0;

y = (1.0/(24.3*24.0*3600.0))*x;
cout << "y = " << y << endl;

z = x/(24.3*24.0*3600.0);
cout << "z = " << z << endl;

return 0;
}

我在 g++ 和 clang++ 上测试了它,并在两者上得到了以下输出

y = 4.76299e-07
Floating point exception

这是怎么回事?

最佳答案

那是 FE_INEXACT 异常。
这意味着 x 乘以编译时计算的常量 1/(24.3*24.0*3600.0) 不能在不损失精度的情况下转换为 double。

第一个操作不会引发此异常,因为 x 是 1.0,它具有精确的表示形式,并且常量已在编译时转换为某种(不精确的)double 表示形式。

由于浮点异常处理未标准化,这在其他编译器/平台上可能不会被注意到。

#include <iostream>
#include <cmath>
#include <fenv.h>

using namespace std;

int main(void)
{
feenableexcept(FE_INEXACT); // comment this line out and the exception is gone

double x,y,z;

x = 1.0;

y = (1.0/(24.3*24.0*3600.0))*x;
cout << "y = " << y << endl;
z = x/(24.3*24.0*3600.0); // <-- FE_INEXACT exception
cout << "z = " << z << endl;

return 0;
}

这个异常显然是默认禁用的,否则你根本无法进行任何浮点计算。

关于c++ - SIGFPE 恶作剧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21554646/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com