2014-01-15 64 views
0

我知道如何將整數和浮點數轉換爲binay。但是一些浮點數沒有確切的二進制格式。像0.5可以精確地寫成0.1,0.25可以寫成0.01。但是如何確定一個數字是否可以完全轉換爲二進制?檢查浮點數是否完全轉換爲二進制

+0

您想知道人類如何檢查數字或如何編寫將檢查十進制數字? –

回答

1

要表示一個二進制浮點格式,數字必須是二的冪的倍數,包括負冪。例如,.375可以表示,它是1/8的倍數。 (1/8是.125,並且.375是那個的三倍)。由於數字的部分必須符合浮點格式,因此還有其他要求:

有限數字可以用通用IEEE 754雙精度格式當且僅當它等於中號•2 ë對於某些整數中號Ë使得-2 < 中號 和-1074 ≤e≤971.

對於單精度,-2 < 中號 和-149≤Ë≤104

這些值來自指定所述浮動參數點格式,比如分數和指數字段有多少位可用,以及指數有多少偏差。


以下是測試數字是否符合上述條件的方法。

首先,如果數字有一個小數部分,請嘗試乘以數字2,直到沒有小數部分。如果你乘以149(單精度)或1074乘(雙精度),這個數字是不可表示的。如果這個數字沒有小數部分,但是是平分的,則除以2,直到奇數。 104(單精度)或971(雙精度)分度後停止。當您完成乘法或除法時,請查看剩餘數字的絕對值。如果它大於或等於16,777,216(對於單精度)或9,007,199,254,740,992(對於雙精度),則該數字不可表示。否則,它是。 (提示:當用十進制數字進行乘法步驟時,如果小數部分以5以外的數字結尾,則該數字不可表示,例如,.4和.24不可表示。 ,.25和.625是,雖然.525不是。)

0

如果您有大整數算術可用,請將xxx.yyy重寫爲分數xxxyyy/10^n其中n是小數部分yyy的長度(位數)。

您轉換分子和上面部分,以二進制的分母的十進制表示,然後降低分數:

  • 計算滿足gcd(XXXYYY,10^n)時,
  • reducedNumerator = XXXYYY/GCD(XXXYYY, 10^n)時,
  • reducedDenominator = 10^N/GCD(XXXYYY,10^N)

如果reducedDenominator是整除5(餘數是零),那麼數目並不以二進制所能表述,否則它是,一個nd浮點數可以表示爲
sign*integerSignificand*2^biasedExponent

但是在大多數語言中,有效位數的位數和指數範圍是有限的。

讓我們來看看分子絕對值首先,(我相信不是0),並提取

  • nh設置爲1,最高位=等級,最低位的
  • nl =等級設置爲1

nh+1-nl給你的比特(二進制數字)表示有效所要求的數量,則它必須是限制
例如下,在IEEE 754雙精度:nh+1-nl<=53nh-nl<53

現在讓我們來看看分母,如果不能整除5,它是兩個10 .... 0的功率,所以我們也可以重寫整除試驗:取

    如果DH不等於DL中,然後數目並不以二進制所能表述最高位的
  • dh =秩設置爲1
  • dl =秩最低位的設置爲1


如果dh==dl,您必須有nh-dh保持在一定的範圍內,但也nl-dh

例如,在IEEE 754雙精度:-1074 <= nl-dhnh-dh <= 1023

,如果你使用的是IEEE 754種格式,是要知道什麼是有趣的,更簡單的是否通過的libc或提供的轉換功能atodatof相當於您的語言提供的將正確提高IEEE 754不精確標誌,以及如何使用您的語言訪問此標誌...

相關問題