计算机中的数值问题

来源:互联网 发布:java如何做界面设计 编辑:程序博客网 时间:2024/05/22 15:44

    现代计算机几乎都服从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浮点标准后,我们就

不需要进行特别的检查,这样就使得程序更加简单,稳健,高效