浮點數不能表示的最小正整數是?

時間 2021-06-09 16:59:57

1樓:春日的憂鬱

首先浮點數呈離散分布,且其步長為2^e×2^(-n)(此公式證明可參照此問題下另一位答主的數學推導),取實際階碼值(階碼用移碼表出)e=n,步長為1,此時最大可表達的值為11……11B(由於隱藏位,共n+1個1),算出2^(n+1)-1,此時從2^n到2^(n+1)-1之間的正整數都能精確表達。實際上通過改變階碼e值(或說調整邏輯小數點位置)易證得從+1到2^(n+1)-1之間的正整數都能精確表達,考慮浮點數的特殊值「+0」,「-0」也能表出。

感覺這題就是想騙你寫個2^(n+1),這個數看上去要用n+1位尾數(算上隱藏位要用n+2位)才表達,但其二進位製碼除了隱藏位全是0,100……00B(n+1個0),對其進行尾數右移同時階碼加一的右規操作後,不會丟失任何精度,是可以用n位尾數(加上隱藏n+1位)精確表達的。當進行右規操作後實際階碼值將變為e=n+1,同時離散域的步長值變為2,此時從2^(n+1)到2^(n+2)-2之間的偶數值均能精確表達。同理通過改變e值易證得從+2到+2^(n+1)-2之間的所有正偶數也能精確表出。

最後考慮2^(n+1)+1,其二進位製碼為1000……001B(中間n 個0),當步長為1時,由於尾數字數限制,不能精確表出,一但對其進行右規操作,又必然損失最後的有效位1,故不能精確表出。

綜上,含有隱藏位的且有n位尾數的二進位制浮點數(即IEEE標準的浮點數)不能精確表達的最小正整數為2^(n+1)+1。

2樓:朱先生

今天重新讀浮點數的時候看到了這個問題,因為對二進位制仍然並不是很熟悉,我給出乙個數學角度的觀點。首先,問題是不能表示的最小正整數。因此只要考慮規格化數就好了。

對於具有n位小數的浮點數,將每個階碼相同的數字列為一組,其規格化數(這裡s位預設為0)可以表示為:

對以上每一組,若以k為計數,第k組區間表示的離散點的範圍為 。

接下來經過(玄學)觀察就能發現,對每個k,若k滿足 ,那麼每個第k組的離散點一定能取到正整數 ,其中i的範圍是 。用簡單分析就能證明這件事情。

不難發現,每個第k組的點實際上是第0組的點乘以 後的縮放而已。而對於第0組的點,分子是 到 之間乙個不漏的正整數。那麼設對於每個正整數 ,在第k組中有離散點 取到它。

即等式:

解這個等式得到 ,由於限定範圍, 。

這就證明了,所有在1到n之間的k,每個第k組之間離散整數點都可以乙個不漏的取到。

接下來取k=n+1,觀察第n+1組離散點的值:

不難發現, 這個整數是取不到的,並且是取不到的最小整數(因為在k小於等於n時,所有整數都被證明可以被取到)。

所以答案是 。

3樓:YerAlex

(昨天剛好做了這個題

個人感覺題目中的表述不大完整,所以有些難理解,實際上應該補充為:

具有n位規格化尾數並且第1位的1為隱藏位的浮點數,不能表示的最小正整數是多少?

先貼一下書裡的解釋吧

我自己的理解過程如下:

因為加上了隱藏的第一位1,實際上一共有n+1位尾數,正常情況下,n+1位二進位制數最大可表示的值為 ,這個時候即為n+1個1,除去第一位隱藏位之後,可表述的n位全都是1.

所以我這個時候的第一反應是答案是不是 ,但是由於這題有個不講道理的無窮大階碼,所以雖然看上去這個數二進位制格式在1後面跟了n+1個0,但是由於去掉第一位的1之後,後面無論多少0都可以通過階碼搞定,所以 是不對的。

再看 ,這個值的二進位制為第一位1,後接n位,再接一位1,即隱藏掉最高位的1後,還有n+1位數字要表示,但是由於只有n位,所以這個是無法表示的最小正整數。

浮點數的表示中為什麼要用移碼表示階碼?

如果偏移量為127 因此float型的取值範圍為 取值區間大致為 因此float型的取值範圍為 取值區間大致為 為了平衡浮點數精度與取值範圍 精度越大則取值範圍越小,精度越小則取值範圍越大 IEEE標準中,規定8位階碼的偏置為127,使得浮點數的取值範圍更大。 小伊莎 1 首先解釋為什麼要用移碼表示...

浮點數是如何計算hash的?

hash的本質是對二進位制串進行操作,只要有一位不同hash結果就差千萬里。那麼,你的問題就是先把相近的值用相同的二進位制串表達,然後去計算hash。具體怎麼定義相近,就由你自己實現。最簡單的辦法就是用吧。這裡的公式編輯器不支援分數麼? 如何保證被看做相等的兩個數值非常接近的浮點數hash到相同的值...

如何證明1是最小的正整數?

Mr.He 這個是皮亞諾公理體系,與你把0仍不扔進自然數集合是沒有關係的,事實上,把零放進自然數裡,作為自然數定義的開始後,給出正整數的定義,即不等於零的叫做正整數,那麼事實上你仍然可以證明0是最小的自然數,然後利用1是0的唯一後繼數說明1是最小的正整數,也可以直接從正整數集合用歸納法得到。 比如說...