1、 i == i + 1
一個數字永遠不會等于它自己加 1 ? Java ? 強制要求使用 IEEE 754 ? 浮點數算術運算 [IEEE 754] ,它可以讓你用一個 double ? 或 float 來表示無窮大。正如我們在學校里面學到的,無窮大加 1 還是無窮大。
你可以用任何被計算為無 窮 大 的 浮點 算 術 表達式來初 始 化 i , 例 如:
double i = 1.0 / 0.0;
不 過 ,你最好是能夠 利 用 標準類 庫 為你 提供 的 常量 :
double i = Double. P O SI T I V E_I N F I N I T Y ;
事實 上,你不 必 將 i ? 初 始 化 為無 窮 大 以確 保 循 環 永遠 執 行。任何足夠 大 的 浮點 數都可以 實現 這一目的, 例 如:
double i = 1.0e 4 0;
這 樣做 之所以可以起作用,是因為一個 浮點 數值 越 大 ,它和其后 繼 數值之間的間 隔 就 越 大 。 浮點 數的這種分 布 是用 固 定數 量 的有 效 位來表 示 它 們 的 必 然結果。對一個足夠 大 的 浮點 數加 1 ? 不會 改 變 它的值,因為 1 ? 是不足以 “ 填 補 它與其后 繼 者 之間的 空 隙 ” 。
浮點
數操作返回的是
最
接近
其
精
確
的數
學
結果的
浮點
數值。一
旦毗鄰
的
浮點
數值之間的
距離
大
于
2
,那么對其中的一個
浮點
數值加
1
?
將不會產生任何
效
果,因為其結果
沒
有達到兩個數值之間的一半。對于
float
?
類
型,加
1
?
不會產生任何
效
果的最
小
級
數是
2的25次方
,即
33,554,43
2
;而對于
double
?
類
型,最
小
級
數是
2的54次方
,
大約
是
1.
8
?
×
?
10
16
。
毗鄰 的 浮點 數值之間的 距離 被 稱 為一個 ulp ,它是 “ 最 小單 位( unit in t h e lastplace ) ” 的 首 字 母 縮 寫 詞 。在 5 .0 ? 版 中, 引 入 了 M at h .ulp ? 方法來計算 float 或 double ? 數值的 ulp 。
總之,用一個 double ? 或一個 float ? 數 值來表示無窮大是可以的。大多數人在第一次聽到這句話時,多少都會有一點吃驚,可能是因為我們無法用任何整數類型來表示無窮大的原因。第二點,將一個很小 的浮點數加到一個很大的浮點數上時,將不會改變大的浮點數的值。這過于違背直覺了,因為對實際的數字來說這是不成立的。我們應該記住二進制浮點算術只是對 實際算術的一種近似。
2、 i != i
一個數 字 總是等于它 自 己 ? ? IEEE 754 ? 浮點 算 術 保 留 了一個 特殊 的值用來表 示 一個不是數 字 的數 量 [IEEE 754] 。這個值就是 NaN ( “ 不是一個數 字 ( Not a Number ) ” 的 縮 寫 ),對于所有 沒 有 良 好的數 字 定義的 浮點 計算, 例 如 0.0/0.0 ,其值都是它。 規范 中描述 道 , NaN ? 不等于任何 浮點 數值,包 括 它 自 身 在 內 [ J LS ? 1 5 .21.1 ] 。
你可以用任何計算結果為 NaN ? 的 浮點 算 術 表達式來初 始 化 i , 例 如:
double i = 0.0 / 0.0;
同 樣 ,為了表達 清 晰 ,你可以使用 標準類 庫 提供 的 常量 :
double i = Double.NaN;
NaN ? 還有其他的 驚 人 之 處 。任何 浮點 操作,只要它的一個或 多 個操作數為 NaN ,那么其結果為 NaN 。這 條規則 是非 常 合 理 的,但是它 卻 具有奇 怪 的結果。 例 如,下面的程序將 打印 false :
class Test {
public static void main( S trin g[] ? ar g s) {
double i = 0.0 / 0.0;
Sy stem.out.println(i - i == 0);
}
}
這 條 計算 NaN ? 的 規則 所 基 于的 原理 是:一 旦 一個計算產生了 NaN ,它就被 損 壞 了, 沒 有任何更 進 一 步 的計算可以 修 復 這 樣 的 損 壞 。 NaN ? 值意圖使 受損 的計算 繼 續執 行下 去 , 直 到方 便 處理 這種 情況 的地方為止。
總之,
float
?
和
double
?
類
型都有一個
特殊
的
NaN
?
值,用來表
示
不是數
字
的數
量
。
?
轉載自:
無碼團隊blog-wuma.koubei.com
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
