2

私はおそらく完全に間違っており、それについては何も知りませんが、プログラミング言語の 10 進数のデータ型について質問があります。浮動小数点数は累乗か何かでバイナリに格納されているため、完全に正確ではないことは理解していますが、10進数のデータ型が10進数がないかのように数値を格納するだけでなく、次のように計算するのはなぜだろうかといつも思っていました。小数がない場合は、後に追加します。この状況のように:

2.159 * 3.507 --> 2159 * 3507 = 7571613
  ^^^     ^^^
  123     456

6 decimals in total... 7571613 -> 7.571613
                        ^^^^^^
                        654321

だから 2.159 * 3.507 = 7.571613

なぜそれだけでうまくいかないのですか?

4

3 に答える 3

9

それはまさに彼らがしていることです。浮動小数点数は指数形式で格納されます。10 進数ベースのコンピューターで作業していると仮定して、これらすべての数値を 2 進数に変更する必要はありません。

あなたは掛けています2.159 * 3.507が、実際に2.159は として保存され2159 * 10^-33.507として保存され3507 * 10^-3ます。10 進数ベースのシステムで作業しているため、が想定されているため、次のように なしで10保存するだけで済みます:または. は「浮動小数点」の位置です。点が左に移動すると浮動小数点は減少し (として格納されます)、点が右に移動すると浮動小数点は増加します (として格納されます)。-3102159,-33507,-3-3.35073507,-435.073507,-2

この 2 つを乗算すると、乗算されるのは 10 進数 (または 2 進数のコンピューターでは 2 進数) だけです。 浮動小数点が追加されます! そのため、舞台裏で何が起こるかは次のとおりです。

2.159 * 3.507
2159,-3 * 3507,-3
2159 * 3507,-3 + -3
7571613,-6

7571613,-6は(10 進数のコンピューターで作業しているため、 を7571613 * 10^-6想定できることを思い出して10ください) と同じ7.571613です。

もちろん、浮動小数点は である必要はありません-3。ストレージに収まるものなら何でもかまいません:

21590 * .3507
2159,1 * 3507,-4
2159 * 3507,1 + -4
7571613,-3
7571.613

そしてもちろん、ほとんどのコンピューターは 10 進数で格納しないため、実際の数値はすべて 2 進数になり、浮動小数点は.2^-9 -> -9ではなく. のようになり10^-3 -> -3ます。しかし、あなたはその考えを理解します。

于 2009-08-17T03:14:34.083 に答える
3

これは「固定小数点演算」と呼ばれます。人々はいつもそれを行っています。

http://gameprogrammer.com/4-fixed.htmlを参照してください。

于 2009-08-17T02:14:33.940 に答える
1

固定小数点演算にはかなりの数の実装があります。ただし、固定小数点ストレージでは非常に迅速に小数点以下の桁数が不足することがよくあります。これは、無理数を保存したり気にしたりしないことがわかっている金融取引に理想的です。

さらに、他の多くの場合、固定小数点演算はオーバーヘッドに値しません。浮動小数点ははるかに高速です。

読むべきもの:

于 2009-08-17T02:24:19.627 に答える