2009-08-17 17 views
2

私はおそらく完全に間違っていると私はそれについて何も知らないが、私はプログラミング言語の10進数のデータ型に関する質問があります。私は浮動小数点数は完全に正確ではないことを理解しています。なぜなら、それらは2進数で何かを格納しているからですが、10進数のデータ型が10進数がないかのように数値を格納するのはなぜかと思っていました。小数点がない場合は、小数点以下を追加してください。このような状況のように:* 3.507一般的なプログラミング:10進数、浮動小数点

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

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

ので2.159 = 7.571613

なぜそれがちょうどそのように動作することはできませんか?

+0

10進数のデータ型は通常、このように動作します。 – RBarryYoung

+0

@Imagist:この例ではあなたに同意しますが、Jeffは、これはすべての質問がポスターの欲しいときに迅速な回答が得られることを依然として望んでいたと述べています。行う。 –

+0

@ Chris-Jester-Young私はコミュニティ主導のアプリケーションのルールは開発者ではなくコミュニティによって決定されるべきだと考えています(Jeffの犯罪ではありません - 彼は素晴らしいプログラマーです)。しかし、質問する人が何かを学ぶのではなく、問題を解決しようとしている場合、特に「このコードのエラーは何ですか?」という質問に対しては、迅速な回答を受け入れることが理にかなっています。ユーザーがすばやく回答したい場所に質問をマークするための「クイック」タグを開始することができますか? – Imagist

答えて

9

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

あなたは2.159 * 3.507を乗算しているが、実際2.1592159 * 10^-3として格納され、3.5073507 * 10^-3として格納されています。小数点ベースのシステムに取り組んでいるので、10が仮定されているので、10のない-3を実際に格納する必要があります。2159,-3または3507,-3です。 -3は「浮動小数点」の位置です。浮動小数点が左に移動すると、浮動小数点数は減少し(は3507,-4として格納されます)、ポイントが右に移動すると浮動小数点数が増加します(35.073507,-2として格納されます)。

2つを掛け合わせると、10進数(またはバイナリコンピュータのバイナリ数)だけが乗算されます。 浮動小数点が追加されます!だから舞台裏で何が起こるかです:

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

7571613,-67.571613と同じである(私たちは小数のコンピュータ上で作業しているので、我々は10を取ることができる覚えている)だけ7571613 * 10^-6です。もちろん

、浮動小数点は-3である必要はありません、それがストレージに収まる何もすることができますので、

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

そしてもちろん、ほとんどのコンピュータは小数点で物事を保存しません実際の数値はすべてバイナリであり、浮動小数点は10^-3 -> -3ではなく2^-9 -> -9のようになります。しかし、あなたはその考えを得る。

+0

それでは、どうしてそれらがいつもpython 2.5.1フロート1.1は1.1000000000000001になりますか? – mk12

+1

@ Mk12ベースシステムは、分母が基数と共通の要素を持つ場合にのみ、分数を表すことができます。例えば、「2 * 2 * 2」には「8」、「5 * 2」には「10」から「2」が共通しているため、「1/8」はベース '10' 。しかしながら、「3」が「3」になるため、「1/3」は表現できない。無限の記憶領域がある場合は、永遠に繰り返すことで記憶できますが、コンピュータには無限の記憶領域がありません。 – Imagist

+1

@ Mk12(続き)コンピュータは基本的に「2」のものを格納するので、分母に「2」の係数のみを含む数だけを表すことができます。 1.1の場合、実際には '11/10'です。 「10」は「5 * 2」に、「5」は無限に繰り返されることなく、「2」で表現することはできません。コンピュータは少しだけ番号を繰り返しますが、最終的には停止する必要があります。それが止まるところでは、最後の桁を四捨五入します。これは基本的に6桁の繰り返しは.66667と同じですが、5桁しか格納できないためです。 – Imagist

3

これは「fixed-point arithmetic」と呼ばれています。人々はいつもそうしています。

は、固定小数点演算のかなりの数の実装がありますhttp://gameprogrammer.com/4-fixed.html

+0

+1 Lott。 トレードオフに留意してください:固定小数点演算で得られる正確な計算は、同じビット数で表すことができるより小さな値の範囲を犠牲にして行われます。 S. Lottのgameprogrammer.comリンクは、ハードウェアベースの浮動小数点プロセッサがほとんどのユーザーが持っていなかった高価なオプションであった80386以前のプロセッサ(および80487SX)の思い出をもたらします。これとは対照的に、あなたのグラフィックスカードの浮動小数点プロセッサはあなたのCPUより速いかもしれません:http://boinc.berkeley.edu/cuda.php –

1

を参照してください。しかし、固定小数点ストレージでは非常に迅速に小数点以下を使い果たします。それは、不合理な数字を保存/管理しないことがわかっている通貨取引には理想的です。

さらに、他の多くの点では、固定小数点演算だけでオーバーヘッドに値するものではありません。浮動小数点のほうがはるかに高速です。読んで

もの:

関連する問題