2013-03-21 80 views
4

我想在C中編寫一個解析器,它的一部分工作是將一系列字符轉換爲double。到目前爲止,我一直在使用strtod,但我發現它非常危險,它不會處理數字位於緩衝區末尾的情況,該緩衝區不是以null結尾。編寫我自己的float解析器

我想我會寫我自己的。如果我有一個ab形式的數字的字符串表示,我會不會認爲我可以計算(雙)a +((double)b /(double)10^n),其中n是數字在B?

例如,23.4563:

一個= 23 B = 4563

最終答案:23 +(10000分之4563)

還是會產生相對於IEEE格式不準確的結果的花車?

+2

其一,如果'B'是一個整數類型,'b/10^N'會被轉換爲之前得到四捨五入'float'。你想把劇本放在圓括號裏面。另外,你需要確保'a'或'b'中沒有整數溢出。 – Shahbaz 2013-03-21 17:44:48

+0

對不起,是的,你是對的 - 我的錯字。我會編輯它。 – Cthutu 2013-03-21 17:55:50

+0

更多思考:負數,指數格式'1.2E10'。負指數,...我真的*建議你只複製到一個空終止緩衝區,讓strtod完成繁重的工作。 – Roddy 2013-03-21 17:58:14

回答

3

很難準確地讀出浮點數字,因爲存在各種必須認真解決的問題,許多人都沒有這樣做。但是,這是一個解決的問題。要開始,請參閱this paper

我同意Roddy的觀點,你可能最好將數據複製到緩衝區並使用現有的庫函數。 (但是,您應該檢查您的C實現是否提供了浮點數字的正確四捨五入轉換,C標準並不要求它,並且某些實現不提供它。)

+1

+1這不是一個簡單的問題。 – 2013-03-21 19:35:14

1

您可能感興趣this answer of mine to a somewhat related question

該答案中的解析器將十進制浮點數(表示爲字符串)轉換爲IEEE-754浮點數並雙精度四捨五入。

據我所知,代碼中唯一的問題是它可能無法處理指數部分太大(不適合整數)的情況,並且應該等於返回一個錯誤或INF

否則,它應該給你一個好主意該怎麼做(如果你有任何想法,你所做的一切:)。

+0

不錯的代碼。但有一句話:你說「指數部分太大(不適合整數)的情況,應該等於返回一個錯誤或INF。」這很有趣,因爲我也寫了自己的小數點到浮點數,因爲我可以依賴現有的bigint實現),所以我也犯了同樣的錯誤,也就是說,假設一個指數太大而不適合int的情況意味着float是無限的。 http://blog.frama-c.com/index.php?post/2012/11/19/Funny-floating-point-bugs-in-Frama-C-Oxygen-s-front-end – 2013-03-21 22:21:17

+0

@PascalCuoq :) :) :) – 2013-03-21 22:52:42

1

前面已經說過,這是困難的,你需要額外的精度,等等

但是,如果你限制輸入,並想知道你是否能正確地還是這些受限制的十進制轉換爲二進制半幼稚算法和標準IEEE 754 OPS,你可能有興趣在我的回答

How to manually parse a floating point number from a string