- PR -

490/4.9=99.99999

投稿者投稿内容
MERCY
会議室デビュー日: 2005/07/12
投稿数: 18
投稿日時: 2005-11-20 21:48
引用:

未記入さんの書き込み (2005-11-20 21:10) より:

どうにもならないんじゃないの。
偶然切捨てで真の答えと等しくなっただけじゃないの。
0.5は0と1のちょうど間だから四捨五入じゃなくて、
50%の確率で0.5を切り捨てにすると良いって話もあるし。
オイオイ


ほぼ全ての言語でそうなってる筈ですよ?
JIS,ISO,IEEE方式の四捨五入って
四捨五入する桁以下が5ちょうどの場合は前の桁が偶数になるように丸める
って規定されてるので

ちなみに、論点に関してはずれてませんよ
2進数に手で変換してみりゃ分かりますが・・・・
二進数で、表現できる一番近い値=四捨五入した値で計算が行われてるだけです。
四捨五入って処理をするとちょっと大きいか、ちょっと小さい結果が返るものですよね?
だから、490をちょっと超えた値と、100にちょっと足りない値が帰って来てますね
切捨てって処理をやったら、本当の結果より小さい値になることが保証されますよね?
実際にそうなっていませんか?

有効桁の件は、勝手に決めればいい話です。
そもそも有効桁ってそういうもんです。
まぁ、Doubleを使うなら15桁程度ですけど
ただ、切捨て処理をした後に有効桁がどうのって言われても
この辺は今までの回答者の方は常識として扱われたのではないでしょうか?
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2005-11-20 22:08
引用:

今回、係数を使ってAをBに換算する処理は、どちらも「小数点第2位」で「切り捨て」を行なっていました。

そこが問題じゃないのかと。


当たり前でしょう。
引用:


A=100
K=4.9

(1).B=A*K=100*4.9=490.00000(端数処理にて490.0となる)
(2).A=B/K=490/4.9=99.99999999999 (端数処理にて99.9となる)

このような場合、(1)と(2)で同じ端数処理ではダメですね。
それじゃあ、(1)が切り捨てなら(2)は切り上げ?
どちらも四捨五入なら問題ない?


「目的に応じて」とは何人もの方が指摘しています。
コンピューターは、実数を完璧に扱うことはできません。
有効桁数を意識しない小数の取扱なんぞ、最初から無意味ですよ。

それがいやなら、二進化十進表現を使えばいいのです。
こっちなら、少なくとも電卓と同じ感覚で使えるでしょう。
引用:

その辺が問題となってきます。


siopさんが、「2進数の小数が10進数の小数と同じように振る舞ってくれない」と
だだをこねてるだけです。
この場合の「十進数」も、人間の扱えるそれと、コンピューターの扱えるそれは違いがあますよ。
引用:

みなさんの、4.9を2進数に変換してみたら?という指摘を受けて、なんか違う方向に言ってるな〜と思ってたのですが、そういうことだったんです。


一生に一回でいいから、やってごらんなさい。

おそらく、siopさんは、「二進化十進表現」の意味を、理解していなんでしょう。

[ メッセージ編集済み 編集者: さいくろう 編集日時 2005-11-20 22:35 ]
未記入
大ベテラン
会議室デビュー日: 2005/03/12
投稿数: 148
投稿日時: 2005-11-20 22:26
何が何でもsiop氏に2進数で4.9を表現させようとするやつが沸いてくるなあ。
IEEE754で4.9を正確に表現できないってことはもうわかってるだろうに。

進化十進表現?電卓と同じ感覚?

中の仕組みなんて知らなくていいんだよ。
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2005-11-20 22:33
引用:

未記入さんの書き込み (2005-11-20 22:26) より:

中の仕組みなんて知らなくていいんだよ。


わからなければ、それでオシマイ、というのも手でしょうよ。
技術者として恥ずかしくないんならね。
それだけのハナシ。

ちなみに、「490」は「490」以外の何物でもないよ。
二進数表現は、十進数の整数を表現する場合、誤差は生じないからね。

[ メッセージ編集済み 編集者: さいくろう 編集日時 2005-11-20 22:34 ]
未記入
大ベテラン
会議室デビュー日: 2005/03/12
投稿数: 148
投稿日時: 2005-11-20 22:46
当たり前とかほかの人も指摘しているとか
IEEE754やDecimalの中身知らないと恥ずかしいとか
一生に一回でいいからとか
役にたたねえ回答だな。

回答者って質問者に回りくどいことさせたがるんだよな。
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2005-11-20 22:59
まるでチャットだな。
片棒を担いでいるのは自分だけどね。

「急がば回れ」っていうでしょ。
手順を踏めば、必要なものがちゃんと手にはいるんだよ。
この掲示板には、気色が悪いくらい優しい人がそろってるし。

「わからない」ということを、どう扱うか。
まあ、人それぞれだ。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-20 23:03
引用:

siopさんの書き込み (2005-11-20 20:39) より:

今回問題となった現象について、いろいろと考えたのですが、端数処理に問題があったような気がします。
データ型がDoubleなのかDecimalなのかは問題ではなく、有効桁はどこまでで、端数をどうするのか。


 どういう計算をしなければならず、どれくらいの数値を扱って、何桁の有効数字がほしいから、その範囲の数値を扱える型は何か、、、という、型選びを間違えている。
 単に実数を扱うから double を選んだ、という感じがする。


引用:

実際のところ、プログラム内の小数点の掛け算や割り算では端数処理を行なっています。
どの桁(小数点第1位か第2位か、整数部1桁目かなど)でどうする(切り捨て、切り上げ、四捨五入など)のか。


 有効(必要)桁数の一つ下[編集]必要桁数より下[/編集]で、どのような値が欲しいかで決めます。
 計算結果より小さい値が欲しいなら切り捨て。計算結果より大きい値が欲しいなら切り上げ。より近い値が欲しいなら四捨五入(または偶数丸め)。


 というように、必要に応じて最適なものを選ばなければいけないんだけど、必要なことを明確にせずに「えいや」で決めてしまったように思います。


引用:

(1).B=A*K=100*4.9=490.00000(端数処理にて490.0となる)
(2).A=B/K=490/4.9=99.99999999999 (端数処理にて99.9となる)

このような場合、(1)と(2)で同じ端数処理ではダメですね。
それじゃあ、(1)が切り捨てなら(2)は切り上げ?
どちらも四捨五入なら問題ない?


 だから、なぜそうするか、というところを明確にしなければなりません。
 たとえば、消費税の処理で、店によって
・すべての商品の元値を足してから、1.05をかける
・すべての商品を1.05倍してから足す
と、計算方法が違います。また、1円未満の端数についても、切り捨ての店もあれば、切り上げの店もあり、四捨五入の店もあります。それぞれ目的があって、その計算方法を選んでいます。

 ですから、siopさんが、なぜ double で切り捨てを選んだのか、そこが問題です。



引用:

みなさんの、4.9を2進数に変換してみたら?という指摘を受けて、なんか違う方向に言ってるな〜と思ってたのですが、そういうことだったんです。


 問題の根本原因を知っておくことは、損ではないと思います。
 2005-11-19 07:51 からは、なぜ 4.9 が2進数で表せないのか、ご存じでないように思います。
 逆に、なぜ表せないのか知らないから、「えいや」で選んだのではないでしょうか。
___________________________________________________________________
□ written by Jitta on 2005/11/20
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006

_________________
検索のコツ質問のコツ

[ メッセージ編集済み 編集者: Jitta 編集日時 2005-11-20 23:05 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-11-20 23:46
引用:

何が何でもsiop氏に2進数で4.9を表現させようとするやつが沸いてくるなあ。
IEEE754で4.9を正確に表現できないってことはもうわかってるだろうに。

進化十進表現?電卓と同じ感覚?

中の仕組みなんて知らなくていいんだよ。


単に答えが欲しいだけなら、OKWEBとかHatenaで充分でしょう。
IT技術者がIT技術者に質問しているので、
IT技術者として常識的である内容についての突っ込みがあっても
当然の結果であるような気がします。

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