1

完全に正確な10進値を作成することは可能ですか?

私のコンピューターでは、C ++の整数値は32ビットで、along/double/long longは64ビットです。1.xxxxx...浮動小数点値の最初の部分に仮数を掛けたものがあるというのが私の信念であり、これが間違っている場合は訂正してください。したがって、そこには10進数があり、1の後の部分は10進数値です。

したがって、2つの整数を単純に「プロップ」して、完全に正確な10進値を作成することは可能でしょうか。

4294967295.4294967295その場合、符号付きの値またはの最大値が得2147483647.4294967295られます(小数は符号付きである必要はありません)。

これは以前に行われたことがありますか?もしそうなら、なぜそれはダブルスやフロートと比較して人気がないのですか?

4

1 に答える 1

3

はいといいえ

簡単に言うと、提案のバリエーションは、完全に正確な10進文字列を操作するために常に使用されます。これは一般的なコンピューターのネイティブ形式ではないため、ソフトウェアで処理されますが、最近のCPU速度を考えると、それはほとんど問題になりません。重要なのは、小数部を基数10の10進文字列として格納することです。

さて、あなたの提案は、ビット32と33の間に2進数の小数点がある固定小数点数を提案しているようです。これも行われていますが、小数点以下の文字列の分数が表現できないという問題は解決されません。

ご覧のとおり、問題は、10進数の文字列の分数がx /(2 n * 5 m )の形式の有理数であり、そのような値のほとんどがx / 2nのみを表す2進数の分数では表現できないことです。

したがって、たとえば、.01.99の間では、 .25.50、および.75のみが正確なバイナリ表現を持ちます。これは、IEEE浮動小数点と固定小数点の提案の両方に当てはまります。

ここで、2進数の固定小数点の代わりに、10の累乗で数値を単純にスケーリングすると、すべての数値が正確になります。したがって、スケールが10 6の場合、$123.45は123450000として保存されます。

つまり、2つの選択肢があります。すべての整数は2進数または10進数で正確に表現されるため、分数を保存せずに上記のように単純にスケーリングする分数を保存して内部的に10進数で行うことができます。たとえば、1桁あたり4ビットを割り当てます。この形式はBCDと呼ばれます。

これらのテクニックはすべて数え切れないほど実装されているので、実際に自分で行う必要はありません。たとえば、RubyのBigDecimalを見てください。

文明をもう一度やり直す場合は、2の累乗の数を選ぶと便利かもしれません。これらの問題はすべて、小数値IRLの記述方法に直接起因します。10進数の文字列を使用しますが、これを2進数の分数として正確に表すことはほとんど不可能です。

于 2013-02-13T01:07:57.663 に答える