现代计算机几乎都服从IEEE浮点标准,当对数值算法编码时,IEEE浮点数表示具有很多重要特性。
IEEE浮点实数中有三个"特殊值":
1.无穷大(∞):比任何其他有效数都大的有效数。
2.负无穷大(-∞):比任何其他有效数都小的有效数。
3.无效数(NaN):这是一个无效数,由未定义运算得出的结果,例如0/0.
IEEE浮点标准的制定中做了一些 规定,对于任意实数a,下面的规则成立:
+a/(+∞) = +0
-a/(+∞) = -0
+a/(-∞) = -0
-a/(-∞) = +0
需要注意的是IEEE浮点标准将-0和+0区别开。在多数图形学程序中,这种区别不大,但是对于更经典的数值算法,必须牢记这一点。
其他涉及无穷大的运算,与期望的结果一样。对于正实数a,则有
∞+∞ = +∞
∞-∞ = NaN
∞*∞ = ∞
∞/∞ = NaN
∞/a = ∞
∞/0 = ∞
0/0 = NaN
涉及无穷大的布尔表达式规则如下,与期望的结果一样:
1.所有有效的有效数都小于+∞
2.所有有效的有效数都大于-∞
3.-∞小于+∞
包含无效数(NaN)的表达式规则很简单,具体如下:
1.任何包含NaN的算术表达式,结果是NaN
2.任何包含NaN的布尔表达式,结果是假
也许在IEEE浮点标准中最实用的是堆除数为0的情况的处理。对于任意正实数a,下面包含除数为0 的规则成立:
+a/+0 = +∞
-a/+0 = -∞
在IEEE浮点标准出现之前,如果遇到除0导致崩溃,我们就会很无奈的在代码中添加浮点数是否接近于0 的判断。有了IEEE浮点标准后,我们就
不需要进行特别的检查,这样就使得程序更加简单,稳健,高效