對於這個問題,我做而不是有能力使用printf
設施(我不能告訴你爲什麼,不幸的是,但現在我們假設我知道我在做什麼)。如何打印出IEEE754號碼(無printf)?
對於IEEE754單精度數,則有以下位:
SEEE EEEE EFFF FFFF FFFF FFFF FFFF FFFF
其中S
是符號,E
是指數和F
是分數。
打印跡象是比較容易的所有情況,因爲正趕上所有的特殊情況下,像NaN
(E == 0xff, F != 0
),Inf
(E == 0xff, F == 0
)和0
(E == 0, F == 0
,視爲特殊只是因爲指數偏差沒有在這種情況下使用)。
我有兩個問題。
第一個是如何最好地將非規範化數字(其中E == 0, F != 0
)轉換爲規範化數字(其中1 <= E <= 0xfe
)?我懷疑這將是必要的,以簡化對下一個問題的答案(但我可能是錯的,所以請隨時教育我)。
第二個問題是如何打印出規範化的數字。我希望能夠以兩種方式將它們打印出來,如-3.74195E3
等指數和非指數如3741.95
。雖然,只要看看這兩個並排,只需移動小數點就可以很容易地將前者變成後者。所以我們只關注指數形式。
我有我以前早就打印出來PI,你使用的日益減少公式之一,並保持對可能性的上限和下限,輸出數字算法的一個模糊的記憶,當這兩個限制同意,並將計算偏移10倍(因此當上限和下限分別爲
3.2364
和3.1234
時,可以輸出3
並在計算中進行調整)。但是自從我這麼做以來,它一直是long因此我甚至不知道這是否適合採取此方法。看起來如此,因爲當移動小數部分(
1/2
,1/4
,1/8
等)時,每一位的值是前一位的一半。
我真的喜歡不不得不去通過printf
源代碼跋涉,除非絕對必要的,這樣,如果有人可以幫助與此,我永遠感激。
你需要一個快速的或任何會做? – ruslik 2010-11-25 08:28:47
這是一個黑暗的角落,每一刻都有微妙的等待咬住。通過使用許可證從C運行時庫提取代碼可以更好地滿足您的預期用途。當然,轉換其他方向並不容易...... – RBerteig 2010-11-25 08:29:02
這裏是[eglibc的實現](http://www.eglibc.org/cgi-bin/viewcvs.cgi/branches/eglibc-2_12 /libc/stdio-common/printf_fp.c?rev=10495&view=markup)。它似乎有很好的評論,但閱讀起來並不樂觀。 OMG! – 2010-11-25 13:11:53