質問

私はおそらく完全に間違っているでしょうし、それについては何も知りませんが、プログラミング言語の小数データ型について質問があります。フロートは完全に正確ではないことを理解しています。なぜなら、それらはパワーなどでバイナリに保存されているからですが、小数点以下のデータ型が小数点がないかのように数字を保存しないのはなぜだといつも思っていました。小数がない場合は、後に追加します。この状況のように:

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

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

したがって、2.159 * 3.507 = 7.571613

なぜそのように機能するのですか?

役に立ちましたか?

解決

それはまさに彼らがしていることです。浮動小数点数は指数形式で保存されます。小数ベースのコンピューターに取り組んでいると仮定して、これらすべての数値をバイナリに変更する必要はありません。

あなたは増殖しています 2.159 * 3.507, 、しかし実際には 2.159 として保存されます 2159 * 10^-33.507 として保存されます 3507 * 10^-3. 。小数ベースのシステムに取り組んでいるため、 10 想定されているので、私たちは本当に保存する必要があります -3 なしで 10, 、 このような: 2159,-3 また 3507,-3. 。 -3 「フローティングポイント」の位置です。ポイントが移動すると、浮動小数点が減少します(.3507 として保存されます 3507,-4)そして、ポイントが右に移動すると、フローティングポイントが増加します(35.07 として保存されます 3507,-2).

2つを掛けると、小数点以下の数字(またはバイナリコンピューターのバイナリ番号)が乗算される唯一のものです。 フローティングポイントが追加されます! 舞台裏で何が起こるかは次のとおりです。

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

7571613,-6 ただです 7571613 * 10^-6 (私たちはと仮定できることを忘れないでください 10 小数点以下のコンピューターで作業しているからです) 7.571613.

もちろん、フローティングポイントは -3, 、それはストレージに収まるものかもしれません:

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

そしてもちろん、ほとんどのコンピューターは10進数で物を保存しないため、実際の数字はすべてバイナリになり、浮動ポイントは次のようなものになります 2^-9 -> -9 それよりも 10^-3 -> -3. 。しかし、あなたはアイデアを得ます。

他のヒント

これは「」と呼ばれています固定点算術「人々はいつもそれをします。

見る http://gameprogrammer.com/4-fixed.html

固定点算術の実装はかなりあります。しかし、私たちはしばしば、固定ポイントストレージで非常に迅速に小数点以下を使い果たします。それは、私たちが不合理な数字を保存/気にするつもりはないことを知っている金融取引に最適です。

さらに、他の多くのことについては、固定点の算術はオーバーヘッドの価値がありません。フローティングポイントははるかに高速です。

読むべきこと:

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top