2011-09-02 64 views
4

這不是一個真實項目的問題;我只是好奇。增加一倍到下一個最接近的值?

我們可以使用增量運算符(i++)來增加int。您可以將此操作定義爲:
這會增加最接近i的變量。在這種情況下,它只是+1。

但我正在考慮根據IEEE 754-2008系統定義在特定範圍內可用的double值的數量。我將能夠設置一個圖表來展示這些數量在一些範圍內,並看看它是如何下降。

我想應該有一個按比例增加雙倍到最接近的值比原來的雙倍。

我在Wikipedia發現是這樣的:

雙精度的例子

0x 3ff0 0000 0000 0000 = 1 
0x 3ff0 0000 0000 0001 = 1.0000000000000002, the next higher number > 1 
0x 3ff0 0000 0000 0002 = 1.0000000000000004 

在這裏,你可以看到下一個更高的數目由增大的二進制內容獲得。但我不認爲這會繼續工作,因爲雙方案是這樣的:

enter image description here

我想別的東西應該執行,使當所有的分數位被設置爲最小增幅一。

也許這個操作有一個名字?有趣的參考?
的任何信息都是歡迎:d

感謝

+0

這個問題與指定的語言完全沒有關係。 – Puppy

+1

我知道,但這樣,你會接觸到人。就個人而言,我一直在看我的首選標籤。 –

回答

4

這裏劃分顯著,你可以看到一個較大編號是通過增加二進制內容而獲得的。但我不認爲這會繼續工作,因爲雙方案是這樣的:

[圖片省略]

我認爲,當所有的分數位設置別的東西應該執行,使最小增幅到一個。

第一次近似,是的,這個確實是的工作。

考慮歸一化的正數:這是一個值 * 2 ë其中1 < = < 2,即 = 1.xxxxxxx(二進制)。存儲值中省略了二進制點之前的「1」,因此存儲值的「分數」(或「尾數」或「有效數」)部分由二進制點之後的位組成。

讓我們想象僅存在4中的小數部分的比特,而不是52:所存儲的值1111(二進制)表示分數部分 = 1.1111(二進制)。把它看作一個整數並遞增它給出0000的一小部分帶進位。

但進位進入指數,增加它。完全正確:在1.1111 * 2 e之後,我們預計的下一個數字是10.0000,這確實是1.0000 * 2 e + 1


我說:「第一近似」 ......代表轉換爲整數,遞增,並轉換回雙,並正正規化數很好地工作。它也適用於正的非正規化數(小於最小規格化數;它們的指數爲0,通常隱藏的位是顯式的)。

它適用於負數如果您的整數表示也符號大小;它通常不會。對於更典型的二進制補碼,你必須減去一個來「增加」一個負雙。最後,最終你會溢出最大的歸一化數字,並將指數增加到無窮大和NaN範圍。

有一篇有趣的文章涵蓋了here

2

在C99有nextafter(3)和朋友。

如果你想用手工來做,我認爲最簡單的方法是用一個整數來表示有效數和一個指數。

如果你是避免次歸和遞增正數,當顯著達到2 < < 52則應該增加指數和2

相關問題