- - PR -
490/4.9=99.99999
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-18 17:36
原則として、同じ精度で値を扱うなら、double型のほうがdecimal型よりデータサイズも小さく演算も高速。科学技術計算では、そもそも入力値にも誤差があるので、有効桁数以下の細かな演算誤差は気にしない。だったら高速でデータサイズが小さいほうが有利。 もちろん財務計算など、そういった誤差が許されない場合もある。そこで生まれたのがDecimalのような二進化十進表現(BCD)。4bitで0〜9を表現し、10進数で計算を行うことで、人間が計算したときと同じ計算結果を得られる。BCD変数自体は、ずいぶん昔からあるよ。
こういう場合、技術計算では有効数字1桁なので、それ以降の桁数は四捨五入しちゃう。値として意味があるのは4.9x10^2であって、それ以降の0.00000000000006は意味がないので無視する。 _________________ 甕星 <mikahosi@abox9.so-net.ne.jp> http://blogs.msmvp.jp/mikahosi/ [ メッセージ編集済み 編集者: 甕星 編集日時 2005-11-18 17:39 ] | ||||||||||||||||
|
投稿日時: 2005-11-18 17:37
同じバイト数で、表現可能な範囲が減少します。 「二進化十進数」で調べてみてください。
仕様ははっきりと定められていて、現象は完璧に把握できます。 後は、人間が都合に応じて手を加えればいいのですよ。 まずは、4.9を自分の手で2進数になおしてみることをお勧めします。 そうか、逆に「0.1を2進数で表してみよう」ってのは、 例題としておもしろいかもしれませんね。 [ メッセージ編集済み 編集者: Edosson 編集日時 2005-11-18 17:48 ] | ||||||||||||||||
|
投稿日時: 2005-11-18 17:47
必要とすることがあるっていうか普通4.9*100とかかれていたら精度は高々2桁と判断するので 問題ないと考えます。理系(工業系)だとこのように「常に精度を考えて計算する」ことが当たり前 なんですけどね(計算可能性のためや、センサ性能等物理量は正確には求まらないため)。 簡単にいえばdouble等は「固定精度値型」というべきもので科学技術演算用に作られています。 decimalは分野がまったく違って会計で使われる(10進数固定(特化)で限定して正確に保持する)型です。 | ||||||||||||||||
|
投稿日時: 2005-11-18 18:05
同じことです。 4.9 を2進数で表記してみれば、そうならざるを得ないことが分かるはずです。
一般に、Decimal の方が Double に比べて ・計算が遅い ・値域が狭い という欠点があります。 こういった欠点が気にならなければ、Decimal を使えばいいし、場合によってはどなたかが書かれていたように、整数型に下駄を履かせるだけでも十分でしょう。
いろいろです。 整数型に下駄を履かせる場合もあるし、多桁のライブラリを作って逃れる場合もあります。
長い計算の途中経過として必要な時もあります。 | ||||||||||||||||
|
投稿日時: 2005-11-18 19:14
COBOLer 以外には有名な話なんですけどねぇ?
10 / 3 * 3 が 10 にならない double/float 型に 0 から 0.1 ずつ足し込むと、10回足しても 1 にならない そういえば、むか〜〜〜〜し作ったスレッド→投票:即計算:10÷3×3= | ||||||||||||||||
|
投稿日時: 2005-11-18 20:40
俺は余りdoubleの精度で困ったことはないが、困った問題ではありますね。
今はそんな意欲ないが、本とか読みまくった時期があったので 知識として既に知っていたので余りモヤモヤしてません。 if a = b が成立しないのに、表示すると同じ値とかね。 標準で装備しているのっていいですね。 自分で固定小数点なんか作るとそりゃ大変。 足し算の動作確認とかしなければならない。 VB.NETを知らないので間違っているかもしれませんが、 1/3とかπやsin,cos,ラジアンなどをDecimalで使う価値って・・・ というより使えるのか。 | ||||||||||||||||
|
投稿日時: 2005-11-19 07:51
モヤモヤ、晴れてきました。
小数点はdoubleを使えばいいや〜って思ってたのですが、間違いですね。 今回、なぜ気付いたのかというと、ある係数を使って数値変換をしたのです。 A=100 K=4.9 ・AにKをかけるとBになる。 B=A*K=100*4.9=490 ・もとのAを得るためにBをKで割る。 A=B/K=490/4.9=99.99999999999 ・元に戻らない! たまたま係数に4.9という数値を使ったから良かったのですが、2進数で循環しない小数だと気付かなかったかも知れません。 OUTPUTを人間が見るものの場合、doubleは使えないってことかな。 | ||||||||||||||||
|
投稿日時: 2005-11-19 08:32
無限にあるものを有限の資源で表そうとすると無理が生じます。
どうしても近似になってしまいます。 「実数はリアルでない!」という人もいますし... http://www.amazon.co.jp/exec/obidos/ASIN/0375423133/qid%3D1132356585/250-2438735-0337026 _________________ IEEE-CSDP 2004-2007 |