各位大神,請問如何在不呼叫庫函式的情況下,用C語言將浮點數化成字串?

時間 2021-05-06 21:10:09

1樓:

諸位大神都是從PC的角度上來解釋,我來從IC的角度來談談。部分處理器是支援浮點乘法運算,這個時候你只要把浮點數安要求儲存並計算就好了,如果沒有硬體浮點乘法就模擬一下浮點運算的過程就好了

2樓:

#include

#define TO_STRING(X) ""#X""

intmain

(void)

3樓:

這個問題看起來容易,實質上涉及到乙個核心的知識,計算機不能精確表示浮點數。

上面就有同學犯了乙個錯誤,對小數字後的數字不斷除10取整即可。

實質上12.34000000000000 看起來是這樣,但是當你執行以上操作時,340000000000 後面會帶著其他的小東西

我以前曾經自己實現過這個演算法,大致用過兩種方法:

小數拿出來,乘以精度,得到的數值用 round 函式後,就是整數

把小數拿出來,用 fmod(a, 0.1) 取餘數,可是問題是,0.789 不斷除 0.1 後,

1的演算法在此:https://

在精度不大的情況下沒有問題。 可是,在乘以大精度的時候就會有問題,因為浮點數不可以精確表示。比如 2.

34 以 35 位精度表示成 2.3400000…000, 當乘以超過一定精度的時候,你就會發現,小數點後不是單純的 0 而是其他數字了。

2的演算法是:

double temp = float_val;

while(temp != 0) {

cout<<"int "<<(int)(temp*10)<

執行結果:

執行結果:

cin val

0.789

float_val 0.789

int 7

float_val 0.089

float_val*10= 0.89

1int 8

float_val 0.09

float_val*10= 0.9

1int 8

float_val 0.1

float_val*10= 1

1int 9

float_val 0.1

float_val*10= 1

問題就在最後 0.09 變成 0.9 後,除 0.

1 再取小數就變 0.1 了。嘗試好幾種方法,無法解決。

最後只可以上網查資料, 發現這個問題竟然是持續幾十年的難題. 要是我無意中完美解決了,就像高斯一樣了

看起來理所當然的簡單的這個轉換,實際上是個難倒眾多計算機科學家的難題,printf 之類的列印函式,就是用了浮點數轉字串的功能。

直到 1971 年,才有 Mr.White 科學家 (Jon White) 解決這個問題,直到 1990 年,Mr.White 才正式發表這演算法的最終版本,Dragon4, 在隨後到最近的幾十年來,語言上的各種浮點數列印字串都是用 Dragon4 演算法,其他人的研究都只是對這個演算法修修補補,直到 Grisu 演算法的出現。

Grisu 演算法由 Florian Loitsch 發表,64 位的浮點數可以用它表示,但是有 0.6% 的依然要用 Dragon4 演算法來表示。

Dragon4的演算法實現翻譯在此:實現sprintf--浮點數列印字串

4樓:Xi Yang

你自己實現格式化部分,然後尋找相應的系統呼叫把字串塞到控制台。

另外,無資料損失、結果為閱讀友好、高效能的浮點格式化演算法是個巨坑。如果你只是心血來潮一問,那麼不要入坑太深。

請問各位大神,如何起訴離婚?

離婚大律師趙麗 向法院提起離婚訴訟時,需要準備的材料如下 1 請求解除夫妻雙方婚姻關係的民事起訴書三份,提交法院乙份,自己留乙份。2 原告的身份證或戶口薄原件,影印乙份交法院。3 被告的身份證影印件或戶口薄影印件或經常居住地證明乙份,交法院。4 結婚證 孩子的醫學出生證明原件,影印三份,兩份提交法院...

請問各位大神,戴森吸塵器如何購買最划算?

翟宅宅 戴森有兩大詬病乙個是電池問題,據說容易壞,雖然我還沒有遇到,另外乙個問題是售後服務問題,有說非常低效,換個零件來回兩三個月,而且保修期內換零件收不收錢都是戴森說得算,動不動就好幾百,當然也有說戴森售後很好,來回寄快遞用順豐而且是戴森公司出的費用,而且壞了直接給換新,所以看地域和運氣。因此買戴...

各位熟悉組裝電腦的前輩們好,請問如何在7千到1萬這個價位內組裝一台電腦?

Paprika 我最近沒關注intel和英偉達,我只能幫別人提個思路啥的,推薦真的沒辦法,抱歉 音訊處理的話,我相對比較熟悉。我個人推薦放棄獨顯,寶全部壓在記憶體,cpu和音效卡上,Kontakt那批音源實在太大只了,開的多了16g也不太夠用。為了減少延時和防止音訊處理負載過大,音效卡和cpu不能太...