gpt4 book ai didi

c++ - 浮点除以零的行为

转载 作者:IT老高 更新时间:2023-10-28 13:59:02 26 4
gpt4 key购买 nike

考虑

#include <iostream>
int main()
{
double a = 1.0 / 0;
double b = -1.0 / 0;
double c = 0.0 / 0;
std::cout << a << b << c; // to stop compilers from optimising out the code.
}

我一直以为a会是+Inf,b会是-Inf,c会是NaN。但是我也听说过严格来说浮点除以零的行为是undefined,因此上面的代码不能被认为是可移植的C++。 (理论上这会抹杀我的百万行代码堆栈的完整性。哎呀。)

谁是正确的?

请注意,我对定义的实现很满意,但我在这里谈论的是吃猫、打喷嚏未定义的行为

最佳答案

C++ 标准不强制采用 IEEE 754 标准,因为这主要取决于硬件架构。

如果硬件/编译器正确实现了 IEEE 754 标准,则该部门将提供预期的 INF、-INF 和 NaN,否则......这取决于。

未定义意味着,编译器实现决定,有很多变数,比如硬件架构、代码生成效率、编译器开发者的懒惰等等。

来源:

除以 0.0 是 undefined

的 C++ 标准状态

C++ Standard 5.6.4

... If the second operand of / or % is zero the behavior is undefined

C++ Standard 18.3.2.4

...static constexpr bool is_iec559;

...56. True if and only if the type adheres to IEC 559 standard.217

...57. Meaningful for all floating point types.

IEEE754的C++检测:

标准库包含一个模板来检测是否支持 IEEE754:

static constexpr bool is_iec559;

#include <numeric>
bool isFloatIeee754 = std::numeric_limits<float>::is_iec559();

如果不支持 IEEE754 怎么办?

视情况而定,通常除以 0 会触发硬件异常并使应用程序终止。

关于c++ - 浮点除以零的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42926763/

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