- PR -

490/4.9=99.99999

投稿者投稿内容
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-11-18 17:36
引用:

Doubleの存在価値って何?
通常の変数は、Decimalを使いまくればいいのか?
Decimalがなかったときには、どうだったの?



原則として、同じ精度で値を扱うなら、double型のほうがdecimal型よりデータサイズも小さく演算も高速。科学技術計算では、そもそも入力値にも誤差があるので、有効桁数以下の細かな演算誤差は気にしない。だったら高速でデータサイズが小さいほうが有利。

もちろん財務計算など、そういった誤差が許されない場合もある。そこで生まれたのがDecimalのような二進化十進表現(BCD)。4bitで0〜9を表現し、10進数で計算を行うことで、人間が計算したときと同じ計算結果を得られる。BCD変数自体は、ずいぶん昔からあるよ。

引用:

とありますが、4.9*100=490.00000000000006 という答えを必要とすることなんてあるのでしょうか?


こういう場合、技術計算では有効数字1桁なので、それ以降の桁数は四捨五入しちゃう。値として意味があるのは4.9x10^2であって、それ以降の0.00000000000006は意味がないので無視する。
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/

[ メッセージ編集済み 編集者: 甕星 編集日時 2005-11-18 17:39 ]
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-11-18 17:37
引用:

Doubleの存在価値って何?


同じバイト数で、表現可能な範囲が減少します。
「二進化十進数」で調べてみてください。
引用:

とありますが、4.9*100=490.00000000000006 という答えを必要とすることなんてあるのでしょうか?


仕様ははっきりと定められていて、現象は完璧に把握できます。
後は、人間が都合に応じて手を加えればいいのですよ。
まずは、4.9を自分の手で2進数になおしてみることをお勧めします。

そうか、逆に「0.1を2進数で表してみよう」ってのは、
例題としておもしろいかもしれませんね。

[ メッセージ編集済み 編集者: Edosson 編集日時 2005-11-18 17:48 ]
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2005-11-18 17:47
引用:


とありますが、4.9*100=490.00000000000006 という答えを必要とすることなんてあるのでしょうか?



必要とすることがあるっていうか普通4.9*100とかかれていたら精度は高々2桁と判断するので
問題ないと考えます。理系(工業系)だとこのように「常に精度を考えて計算する」ことが当たり前
なんですけどね(計算可能性のためや、センサ性能等物理量は正確には求まらないため)。

簡単にいえばdouble等は「固定精度値型」というべきもので科学技術演算用に作られています。
decimalは分野がまったく違って会計で使われる(10進数固定(特化)で限定して正確に保持する)型です。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-11-18 18:05
引用:

そうなると、またモヤモヤが・・・(^^;



同じことです。
4.9 を2進数で表記してみれば、そうならざるを得ないことが分かるはずです。

引用:

Doubleの存在価値って何?
通常の変数は、Decimalを使いまくればいいのか?



一般に、Decimal の方が Double に比べて

・計算が遅い
・値域が狭い

という欠点があります。

こういった欠点が気にならなければ、Decimal を使えばいいし、場合によってはどなたかが書かれていたように、整数型に下駄を履かせるだけでも十分でしょう。

引用:

Decimalがなかったときには、どうだったの?



いろいろです。
整数型に下駄を履かせる場合もあるし、多桁のライブラリを作って逃れる場合もあります。

引用:

ひどりさんの、
>回避の方法は「どんな答えを必要としているか」で変わります。

とありますが、4.9*100=490.00000000000006 という答えを必要とすることなんてあるのでしょうか?



長い計算の途中経過として必要な時もあります。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-18 19:14
 COBOLer 以外には有名な話なんですけどねぇ?

10 / 3 * 3 が 10 にならない
double/float 型に 0 から 0.1 ずつ足し込むと、10回足しても 1 にならない


そういえば、むか〜〜〜〜し作ったスレッド→投票:即計算:10÷3×3=
未記入
大ベテラン
会議室デビュー日: 2005/03/12
投稿数: 148
投稿日時: 2005-11-18 20:40
俺は余りdoubleの精度で困ったことはないが、困った問題ではありますね。
今はそんな意欲ないが、本とか読みまくった時期があったので
知識として既に知っていたので余りモヤモヤしてません。

if a = b が成立しないのに、表示すると同じ値とかね。

標準で装備しているのっていいですね。
自分で固定小数点なんか作るとそりゃ大変。
足し算の動作確認とかしなければならない。

VB.NETを知らないので間違っているかもしれませんが、
1/3とかπやsin,cos,ラジアンなどをDecimalで使う価値って・・・
というより使えるのか。
siop
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 67
投稿日時: 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は使えないってことかな。
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2005-11-19 08:32
無限にあるものを有限の資源で表そうとすると無理が生じます。
どうしても近似になってしまいます。

「実数はリアルでない!」という人もいますし...
http://www.amazon.co.jp/exec/obidos/ASIN/0375423133/qid%3D1132356585/250-2438735-0337026
_________________
IEEE-CSDP 2004-2007

スキルアップ/キャリアアップ(JOB@IT)