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

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