2

HTMLで浮動小数点値をインクリメントするメソッドを追加することについての質問への回答を提供しているときに、IEEE浮動小数点演算inputの一般的な問題であることがわかっています。これは私が見ているものの例(デモ付き)です:

<input type="text" name="BoqTextBox" id="BoqTextBox" value="0.001" />
<input type="Button" id='AddButton' value="+" />
<script>
  $('#AddButton').on('click', function () {
    var input = $('#BoqTextBox');
    input.val(parseFloat(input.val(), 10) + 1);
  })
</script>

ボタンをクリックすると、最初は次のように入力が増加します( IEEEバイナリ表現に+このコンバーターを使用)。

                     S|   Exp   |      Mantissa
0.001              //0 0111 0101 000 0011 0001 0010 0110 1111
1.001              //0 0111 1111 000 0000 0010 0000 1100 0101
2.001              //0 1000 0000 000 0000 0001 0000 0110 0010
3.001              //0 1000 0000 100 0000 0001 0000 0110 0010
4.0009999999999994 //0 1000 0001 000 0000 0000 1000 0011 0001
5.0009999999999994 //0 1000 0001 010 0000 0000 1000 0011 0001
6.0009999999999994 //0 1000 0001 100 0000 0000 1000 0011 0001
7.0009999999999994 //0 1000 0001 110 0000 0000 1000 0011 0001
8.001              //0 1000 0010 000 0000 0000 0100 0001 1001
9.001              //0 1000 0010 001 0000 0000 0100 0001 1001
10.001             //0 1000 0010 010 0000 0000 0100 0001 1001
... then predictably like this until ...
15.001             //0 1000 0010 111 0000 0000 0100 0001 1001
16.000999999999998 //0 1000 0011 000 0000 0000 0010 0000 1100
17.000999999999998 //0 1000 0011 000 1000 0000 0010 0000 1100
18.000999999999998 //0 1000 0011 001 0000 0000 0010 0000 1100
19.000999999999998 //0 1000 0011 001 1000 0000 0010 0000 1100
... then predictably like this until ...
31.000999999999998 //0 1000 0011 111 1000 0000 0010 00001100
32.001             //0 1000 0100 000 0000 0000 0001 00000110
33.001             //0 1000 0100 000 0100 0000 0001 00000110
... then predictably like that up to 256 (a power of 8 seemed fitting to test) ...

私がまだ知らないのは、なぜこの動作がこれらの特定の値で現れるのか、そしてその影響を軽減するためにどのような論理的な手順を実行できるのかということです。実際の計算値を別の場所に保存したまま、表示目的で丸めますか?

4

1 に答える 1

3

ご想像のとおり、出力は丸めた後にのみ出力する必要があります。この動作は、10進数と2進数の基数の違いの結果です。これは、浮動小数点数の2進数形式で正確に表現されていない10進数があるため、2進数に格納してから再度読み取るときに、ある程度の精度が失われるためです。 。浮動小数点数はCPUで1.XXXXX...XXXX * 2 ^ Pの形式で表されるため、この形式から、すべての10進数が限られた長さのそのような表現を持っているわけではないことがわかりますXXXXXX...XXX

于 2013-03-22T20:02:11.807 に答える