为什么 0.0f/0.0f 不会生成任何运行时错误
本文关键字:0f 任何 运行时错误 为什么 | 更新日期: 2023-09-27 18:35:10
最近我测试了以下程序,我期待运行时错误,但它显示"nan"作为输出。为什么和如何?我正在使用 g++ 编译器。
#include <iostream>
int main()
{
float f=0.0f/0.0f;
std::cout<<f;
return 0;
}
同样,我也在Java和C#中尝试了类似类型的程序,它再次显示"nan"作为输出。
class Test
{
public static void main(String args[])
{
float f=0.0f/0.0f;
System.out.println(f);
}
}
class Test
{
public static void Main(string[] args)
{
float f=0.0f/0.0f;
Console.Write(f);
}
}
我想知道浮点算术是如何实现的,以及它与整数算术有何不同。在C++的情况下是未定义的行为吗?如果是,为什么?请帮助我。
nan
代表不是一个数字。除以整数 0 总是一个错误,因为在数学中你不能除以 0。因此,当您除以整数 0 时,许多语言都会引发异常。
使用浮点数执行此操作不太合理,因为浮点计算并不精确。例如,计算可能会导致0.0f
,因为0.0f
是最接近答案的浮点值,而不是因为答案的真实值在数学上为 0。因此,尝试除以浮点值0.0f
可能不是算法不正确的结果。 nan
本质上意味着无法确定计算的答案,因为它涉及两个数字的除法,以至于计算机无法将它们与 0 区分开来。
从 http://en.wikipedia.org/wiki/NaN#Operations_generating_NaN:
生成 NaN 的操作
有三种类型的操作可以返回 NaN:
- 将 NaN 作为至少一个操作数的操作数。
- 不确定形式
- 分区 0/0 和 ±∞/±∞
- 乘法 0×±∞ 和 ±∞×0
加法∞ + (−∞- )、(−∞) + ∞ 和等效减法
。等。
默认情况下,C++运行时库会屏蔽所有浮点异常。因此,计算会产生 NAN 或无穷大,而不是例外。 如果需要例外,可以使用 Windows 上的函数_controlfp_s来取消屏蔽浮点。 异常
以下代码引发异常。使用 VS2010、Win32 配置编译并运行。
#include <float.h>
int main()
{
_controlfp_s(NULL, 0, _MCW_EM); // enable all floating point exceptions
float n = 0;
float f= 0.0f/n;
return 0;
}
你必须知道浮点数允许在零上除法,因此:
1.0/0.0
等于无穷大,这:
1.0/-0.0
等于负无穷大(-0.0 是负零,就像数学中的 1/0- 一样),这:
0.0/0.0
是 NAN,意思不是数字,这在数学缩写中是完全不确定的。这是浮点数,但整数会抛出运行时错误,你可能会问为什么,这是因为浮点数是如何以二进制形式表示的,你可以在这里阅读它:
http://floating-point-gui.de/formats/fp/在 C# 中,你可以说 Double.PositiveInfinity、Double.NegativeInfinity 和 Double.NaN