为什么 0.0f/0.0f 不会生成任何运行时错误?
why 0.0f/0.0f doesn't generate any runtime error?
最近我测试了以下程序,我期待运行时错误,但它显示"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
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 链表c++插入,所有情况都已检查,但没有任何工作
- C++模板函数,用于比较任何无符号整数和有符号整数
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 尝试摆脱任何堆内存分配
- 是否有任何C++功能可以对地图进行排序?
- 打印时有二叉树问题.用户输入不打印任何内容
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C++ 将 CIN 值存储到任何类型的数组中
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- GStreamer在开始任何播放之前进行搜索
- 为什么 0.0f/0.0f 不会生成任何运行时错误?