2010-10-08 33 views
5

可能重複:
Which is the first integer that an IEEE 754 float is incapable of representing exactly?尋找不能被表示爲IEEE-754的32位浮點數的最小整數

首先,這是一個家庭作業的問題,只是爲了清除該立即開始。我當然不是在尋找一個勺子餵食的解決方案,只是一個指向正確方向的小指針。

所以,我的任務是找到不能表示爲IEEE-754浮點(32位)的最小正整數。我知道,測試對類似「5 == 5.00000000001」將失敗平等的,所以我想我會簡單地在所有的數字環路和測試,在這個時尚:

int main(int argc, char **argv) 
{ 
    unsigned int i; /* Loop counter. No need to inizialize here. */ 

    /* Header output */ 
    printf("IEEE floating point rounding failure detection\n\n"); 

    /* Main program processing */ 
    /* Loop over every integer number */ 
    for (i = 0;; ++i) 
    { 
     float result = (float)i; 

     /* TODO: Break condition for integer wrapping */ 

     /* Test integer representation against the IEEE-754 representation */ 
     if (result != i) 
      break; /* Break the loop here */ 
    } 

    /* Result output */ 
    printf("The smallest integer that can not be precisely represented as IEEE-754" 
      " is:\n\t%d", i); 


    return 0; 
} 

這種失敗。然後我試圖從浮點「結果」中減去整數「i」,即「我」,希望能夠實現某種「0.000000002」,我可以嘗試並檢測到,也失敗了。

有人可以指出我可以依賴的浮點屬性來獲得所需的中斷條件嗎?

-------------------- Update below ---------------

感謝您對此的幫助一!我在這裏學到許多東西:

  1. 我最初的想法是確實是正確的,並確定它的目的是要在(Solaris 10中,32位)的計算機上運行的結果,但沒能在我的Linux系統上工作( 64位和32位)。

  2. 漢斯帕桑特加入製作的節目也與我的系統上運行的變化,似乎有一些平臺的差異會在這裏,我沒有想到,

謝謝大家!

+0

它如何失敗?當我編譯並執行你的代碼時,輸​​出是16777217. – Henrik 2010-10-08 11:51:54

+0

@KennyTM:該死,我以爲我擅長搜索!對不起,然後複製。 – LukeN 2010-10-08 11:53:03

+0

@Henrik:它只是保持回捲(INT_MAX - > 0),並且沒有結果。 – LukeN 2010-10-08 11:54:15

回答

5

問題是您的平等測試是浮點測試。變量將被轉換爲浮動,並且當然會產生相同的浮動。將浮點數轉換回int以獲得整數相等性測試:

float result = (float)i; 
int truncated = (int)result; 
if (truncated != i) break; 

如果它以數字16開頭,那麼您找到了正確的數字。將它轉換爲十六進制,並解釋爲什麼這是一個失敗的等級獎金。

+0

謝謝!這是做的伎倆,我很高興我的原始想法證明是有效的:) – LukeN 2010-10-08 12:07:25

2

我想你應該有理由對浮點數的表示爲(基地,符號,尾數,指數)

這是Wikipedia的摘錄,可以給你一個線索:

給定的格式包括:

* Finite numbers, which may be either base 2 (binary) or base 10 

(十進制)。每個有限數是最簡單的由三個整數描述:s = a符號(零或一),c =有效數 (或'係數'),q =指數。有限數 的數值是 (-1)s×c×bq 其中b是基數(2或10)。例如,如果符號爲1 (表示負數),則有效數字 爲12345,指數爲-3,基數爲10,則 數字的值爲-12.345。

0

那將是FLT_MAX+1。請參閱float.h

編輯:或者實際上不是。檢查modf()函數math.h

+0

沒有你試過嗎? – 2010-10-08 12:02:06

+0

@Hans是的,肯定有更小的數字無法表示。 – 2010-10-08 12:03:16

+1

改爲嘗試'(1 << FLT_MANT_DIG)+ 1'。 – 2010-10-08 15:02:53