4

私は C でパーサーを作成しようとしていますが、その仕事の一部は、一連の文字を double に変換することです。これまで strtod を使用してきましたが、非常に危険であることがわかりました。番号がバッファの最後にあり、null で終了していない場合は処理されません。

自分で書こうと思いました。ab 形式の数値の文字列表現がある場合、(double)a + ((double)b​​ / (double)10^n) を計算するだけでよいと考えるのは難しいでしょうか。ここで、n は次の数値です。 bの桁?

たとえば、23.4563:

a = 23 b = 4563

最終的な答え: 23 + (4563/10000)

それとも、フロートの IEEE 形式に関して不正確な結果を生成しますか?

4

3 に答える 3

4

注意深く対処しなければならないさまざまな問題があるという意味で、浮動小数点数を正確に読み取ることは困難であり、多くの人がそうしません。しかし、それは解決された問題です。まず、WilliamD.Clingerによる1990年6月の浮動小数点数を正確に読み取る方法を参照してください。

私はRoddyに同意します。データをバッファにコピーし、既存のライブラリ関数を使用する方がよいでしょう。(ただし、C実装が浮動小数点数の正しく丸められた変換を提供することを確認する必要があります。C標準はそれを必要とせず、一部の実装はそれを提供しません。)

于 2013-03-21T18:19:23.000 に答える
1

多少関連する質問に対する私のこの回答に興味があるかもしれません。

その回答のパーサーは、適切な丸めを使用して、10 進浮動小数点数 (文字列として表される) を IEEE-754 浮動小数点数と倍精度数に変換します。

私が覚えている限り、コードの唯一の問題は、指数部分が大きすぎる (整数に収まらない) 場合を処理できない可能性があり、エラーまたはINF.

それ以外の場合は、何をすべきかについての良いアイデアが得られるはずです (自分が何をしているのか少しでもわかっている場合:)。

于 2013-03-21T20:42:18.547 に答える