- PR -

丸め誤差の対応について、皆様どうしていますか?

投稿者投稿内容
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-06-03 10:36
どもでふ。がるです。
引用:

アマさんの書き込み (2005-06-02 19:14) より:
また、がるがるさんのご指摘で小数点を回避とありますが、
小数点のデータを使用するので逃げられません。
×10とかで計算、後に÷10とか、そういうことでしょうか?


元データが小数込みなら、おそらく「小数の丸めに関する設計」とか
あると思うのですが。
その辺、ここで聞く前に、ちゃんと客先に確認したほうがよいですよ :-P

ちなみに*10で/10は、小数の桁数限界がはっきりしていてかつ
さほど無茶なものでなければ、下手に小数同士で四則演算するよりは
大分と誤差を回避できるかと思います。
飽く迄「大分」って程度ですが。

# 浮動小数点計算用ライブラリとか…作るのはやめましょう。大変です;;
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2005-06-03 10:45
引用:

Edossonさんの書き込み (2005-06-03 10:23) より:

シビアか否かなんて、人間の主観の問題でしかありません。
完全に一致しなければ、すべて誤差。
重要なのは、案件を満たすために、誤差をどのように扱うかです。
そして、その方法は、「どこの桁で[切り上げ|切り捨て|四捨五入]するか」を決めることそれだけですよ。




仰ることはわかるのですが、これだけではないと思いますよ。
例えば、円周を求める際14m(半径)×2×3.14を計算して、87.92mと結果を
出したとします。これは電卓で計算しても、紙の上で計算しても同じ値で
しょう。でも、これ誤差無いですか?もともと3.14自体に誤差が含まれる
わけですね。

要するに、誤差というのは理論レベルで発生してる(考慮する)誤差と
計算上(今のコンピュータで浮動小数点演算を扱う以上必ず発生する)
の誤差とをはっきり区別して考えないといけないわけです。

で、最終的にはそれをどう扱うか?ということが仕様として、どこで四
捨五入するか、切り捨てるのか、切り上げるのか、銀行型まるめを行う
のか、電卓と同じ丸めにするのか...が決められます。
(技術計算では誤差は誤差として別途計算するのが普通ですけどね。)

最後に、その仕様を実現する為にどういうコーディングを行うのかと
いうことで言語によって標準で用意されているRoundUp等が銀行型まる
めになっている場合もあるので、違う処理を考える必要が出るわけです。

この「誤差」というものとコンピュータ内で、7908.499999999999のように
格納されるという誤差は別物として扱わないといけないと思いますがね。
(影響されるので厄介ですが...)
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2005-06-03 11:08
引用:

要するに、誤差というのは理論レベルで発生してる(考慮する)誤差と
計算上(今のコンピュータで浮動小数点演算を扱う以上必ず発生する)
の誤差とをはっきり区別して考えないといけないわけです。


には同意しておきますが、
引用:

Beatleさんの書き込み (2005-06-03 10:45) より:
例えば、円周を求める際14m(半径)×2×3.14を計算して、87.92mと結果を
出したとします。これは電卓で計算しても、紙の上で計算しても同じ値で
しょう。でも、これ誤差無いですか?もともと3.14自体に誤差が含まれる
わけですね。


にはネタツッコミ。

πが3.14なんとかなのは承知の上でも、「3.14」で計算してその結果に誤差がありますよね、と言う論は余り有意義じゃない気がします。コンピュータの演算に限らず。
πなどの定数は(むろん手で計算しても)細々した数字が出てきて困るかもしれませんが、どこの桁数まで使って計算するかは、それこそ他の数字の有効桁数と併せて考えるべき物です。
(適当に検索して引っ張ってきたのであれですが)
http://www2.tokyo-ct.ac.jp/users/m/matsu/essentialFigure/essentialFigure.html
引用:

3.3 定数,物理定数が入る計算
 実際の計算では,データだけでなく定数や精密な物理定数が式にはいることが多い。しかしこれらの値は,有効桁数には影響を与えない。しかし,測定データよりも1桁以上多い定数を使って計算する必要がある。



プログラミング言語上の話であっても、定数PIは必要十分な桁数を持って定義されている物として扱い、計算結果をどこで打ち切る(丸める)かは、やっぱり要件にかかってくる気がします。

※あくまでπを使った話としてのネタです。
アマ
会議室デビュー日: 2004/08/17
投稿数: 12
お住まい・勤務地: コンクリートジャングル
投稿日時: 2005-06-03 13:59
皆様、多くのご返事をありがとうございました。

小数点を含む部分について、
BigDecimalへ書き換えることになりそうです。
要件は小数点2位までの数×整数(または小数点2位までの数)を
電卓のような四捨五入して整数へ丸めることです。

今回、数字をいじくることにこだわったのは、
ただ個人的に気になったからというだけです。

当方の勉強不足に付き合っていただき、
本当に助かりました。
未記入
大ベテラン
会議室デビュー日: 2005/03/12
投稿数: 148
投稿日時: 2005-06-03 22:02
雑談です。
コード:

158.17 * 50
= 7908.499999999999
これって、すでに158.17が158.17じゃないんだよね。

158.16999999999999 * 50.000000000000000;
= 7908.4999999999991
本当はもっと小数点以下が続きます。

有効桁数16桁あたりらしいので、
表示するときは16桁になるように四捨五入するから
158.17 * 50;
= 7908.499999999999
と表示される。



[ メッセージ編集済み 編集者: 未記入 編集日時 2005-06-03 22:05 ]

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