0

有効桁数を設定して浮動小数点演算を計算するようにコンピューターに強制する方法を探しています。これは純粋な学習上の理由であるため、結果の精度が低下することは気にしません。

たとえば、私が持っている場合:

float a = 1.67;
float b = 10.0;
float c = 0.01

float d = a * b + c;

そして、すべての数値を有効数字3桁で表したいのですが、次のように表示します。

d = 16.7;

いいえ:

d = 16.71;

これまでのところ、私はこれを考えられる答えとして得ました:浮動小数点の精度を制限しますか?

しかし、その戦略を使用して、すべての浮動小数点変数を必要な精度で1つに変換すると、コードが肥大化してしまいます。そして、結果と同じことをします。

精度を自動的に修正する方法はありますか?

4

2 に答える 2

1

浮動小数点データ型は 2 進浮動小数点です。つまり、2 進数の精度があり、一般に 10 進数値を正確に表すことは実際には不可能です。その結果、最初に操作を正しい小数点以下の桁数に切り捨てるという問題が発生します。動作する可能性があるのは、各操作の後に浮動小数点値を桁の精度でフォーマットしn(たとえば、 を使用n == 3)、これを浮動小数点値に変換することです。これは特に効率的ではありませんが、機能します。対応する切り捨てロジックでコードを散らかさないようにするには、必要な操作をクラスにカプセル化します。このクラスは、操作を実行し、結果を適切に切り捨てます。

または、仮数と適切な基数 10 の指数を使用して、必要なロジックを実装することもできます。重要な値は -999 か​​ら 999 の間の値に制限されます。このようなクラスを実装するのはおそらくより多くの作業になりますが、結果はより効率的になる可能性があります。

于 2012-10-08T22:54:48.500 に答える
0

これまでのところ、可能な答えとしてこれを得ました:浮動小数点精度を制限しますか?

4 票しか得られなかった承認済みの回答ではなく、10 票を獲得した 2 番目の回答を読んでください。やらないでください。

コンピュータではもちろん、紙の上で計算を行うときは、これを行いたくありません。これらの中間計算は、基になるデータが示すよりも少なくとも 1 桁、できれば 2 桁以上余分に行うのが最適です。最後のデータで示される精度に切り捨てます。紙の上でこれを行う唯一の理由は、多くの数字を扱うのが苦手だからです。これは、人々がどのように計算するか (または計算を誤るか) に合わせて調整された短絡演算です。

中間計算を四捨五入して行うことは、エラーが入り込む余地を作り、コンピューターの速度を低下させることだけです。これらの中間結果の余分な精度について心配する必要はありません。出力時に希望する精度で結果を表示するだけです。

逆の問題が当てはまる場合もあります。中間結果の精度の低下を心配する必要がある場合があります。場合によっては、その精度の低下は、float から double への変更、または double から可変精度演算 (遅い) への変更を意味します。

于 2012-10-08T23:28:03.517 に答える