• ベストアンサー

IEEE規格で「いちばん近い偶数に丸める」根拠は?

http://oshiete1.goo.ne.jp/kotaeru.php3?q=88809 の質問に関連して、質問します。 arataさんの回答にありました参考URL http://www.microsoft.com/mscorp/worldwide/japan/support/kb/articles/j029/9/74.htm を見ました。 そこにあった記述でわからないことがありました。「数値の丸め」の項に 「Visual Basic 4.0 で数値の丸めが発生するケースは、主に代入と Format 関数があります。 代入する値が代入先のデータ型の有効けたを超える場合に丸めが行われます。 ここでの丸めは IEEE (米国電気電子技術者協会) 規格のうちでもっとも 一般的である "いちばん近い偶数に丸める" という方法をとっています。 例えば整数型への代入では、1.5 は 2、2.5 も 2、3.5 は 4 に変換されます。 これは四捨五入より結果に片寄りが少なく、誤差の累積が最も少ない方法の ひとつです。」 この「いちばん近い偶数」を選ぶ理由は何でしょうか? なぜ奇数はダメなのか?ご存知の方、教えてください。

  • prome
  • お礼率73% (74/101)

質問者が選んだベストアンサー

  • ベストアンサー
  • arata
  • ベストアンサー率49% (139/279)
回答No.3

四捨五入の場合 0.1,0.2,0.3,0.4の4つの値が小さく 0.5,0.6,0.7,0.8,0.9の5つの値が大きくなります。 均等に値が発生するとして、値の変化は -0.1-0.2-0.3-0.4=-1 0.5+0.4+0.3+0.2+0.1=1.5 ですから、0~99の間で、100個の値が発生する場合、0~1毎に0.5ずれるのですから、+0.5*10で+5ずれる可能性が高いわけです。これは結構大きな値ですね。 IEEEの丸めの場合 奇数では、0.5は切上げ、偶数では切り捨てられますから、 誤差の累積が0に近いわけですね。 ですから、合計値の誤差を問題にする場合は、後者の方が、合理的ですね。ちなみに、前者を算術型、後者を銀行型の丸めといいます。 本当かどうか知りませんが、アメリカの銀行では後者を使用していると聞いています。 で、偶数か、奇数かですが、どちらでも同じだと思います。どっちでもよくて、偶数に決めたのでは?

prome
質問者

お礼

ありがとうございました。 お礼が遅れてすみません。

その他の回答 (2)

  • haporun
  • ベストアンサー率40% (230/562)
回答No.2

推測ですが、これは少数を記録する方式の問題だと思います。 少数は0.xxxxx×10^xxという方式で、xxの部分をすべて2進数で記録するので、2の倍数にするのが都合がよく、奇数にすると誤差が増えてしまうのでしょう。 これはおそらく、浮動小数点型という少数の記録方式を理解すれば、わかることだと思います。 私はあまり突っ込んでいませんが、調べてみては?

prome
質問者

お礼

お礼が遅れてすみません。 偶数にする理屈に説得力があります。 調べてみます。 ありがとうございました。

noname#1296
noname#1296
回答No.1

 参考URLにある 「これは四捨五入より結果に片寄りが少なく、誤差の累積が最も少ない方法のひとつです。」  の通りではないでしょうか?  Excelのシート上では大丈夫なのに、VBAでは偶数になってしまうっていうのもそうですが、理解はできますがなんか納得いかないですよね。  統計的な数字の四捨五入には問題ないんでしょうけど、金額の端数処理などには全く使えないですよね。

prome
質問者

お礼

ありがとうございました。 お礼が遅れてすみません。

関連するQ&A

  • 素数、偶数、奇数、倍数を求める。

    整数n1と整数n2に適当な値を代入して、n1からn2までの整数を発生し、発生した個々の整数について調べたいのです。 結果は 10 は偶数で 5 の倍数です。 11 は素数です。 12 は偶数で 6 の倍数です。 13 は素数です。 14 は偶数で 7 の倍数です。 15 は奇数で 5 の倍数です。 16 は偶数で 8 の倍数です。 17 は素数です。 18 は偶数で 9 の倍数です。 19 は素数です。 20 は偶数で 10 の倍数です。 となりたいのです。 教えてくださいお願いします。

  • 重量の丸め計算が全く分からず困っています。

    うまく説明できなかったらすいません。 会社で、鉄筋の重量計算をするように言われました。 が、計算方法が全然分かりません。 ☆有効数字3桁にする。 ・4桁目が5ではない場合  →整数部分が2桁の時・・・四捨五入して3桁にする  →整数部分が既に3桁の時・・・四捨五入する ・4桁目が5の場合  →5の前が偶数の時・・・切り捨て  →5の前が奇数の時・・・切り上げ  →5の後に数字が続く時・・・四捨五入して3桁にする  →整数部分が既に3桁の時・・・上記の考え方と同じ(要は四捨五入) エクセル200を使用しています。 非常に困っています。 よろしくお願いします!!!

  • エクセルの使い方

    エクセルの使い方を教えてください。 大変初歩的なことですが、お願いいたします。 エクセルの表計算で、少数以下の掛け算で合計の数字が少数点以下まで表示されます。 この数値を四捨五入にして、整数にし、さらにこの数値に数値をかけます。 ただ、この四捨五入した数値を整数とは認識せず、少数以下の数値で計算するため、求めたい数値になりません。 この四捨五入した数値を整数と認識するための方法をおしえてください。

  • EXCELの特別な数値の丸め方について

    次のやり方で数値を丸めにはどうしたらよいでしょうか? ・基本的には四捨五入する 丸める桁が5の場合だけ、 →(1)ひとつ上の桁が偶数なら5を切り捨て →(2)ひとつ上の桁が奇数なら5を切り上げ たとえば、有効数字4桁の場合、 (1)の例 1.2345→1.234 1.5285→1.528 (2)の例 1.2335→1.234 1.5275→1.528 詳しい方、よろしくお願いします

  • エクセルで数値の桁数を一定の法則で統一したい

    E列にA~D列のデータから計算された数値が並んでいます。 たとえば E1:9.9 E2:86.08695652 E3:212.8571429 E4:1158.13953488372 これらを E1:9.90 (整数1桁の場合は四捨五入して小数2桁まで)       1未満の数値も小数2桁で(例、0.96) E2:86.1 (整数2桁の場合は四捨五入して小数1桁まで) E3:213  (整数3桁の場合は四捨五入して小数カット) E4:1158 (整数4桁の場合は四捨五入して小数カット) 上記の法則で見やすく整理したいのです。 整数4桁が最大です。大量のデータをまとめて整理出来る方法は ないでしょうか?よろしくお願いします。

  • 四捨五入関数を作りたい

    Cでdouble型の数値の四捨五入を考えています。 小数点7桁目を四捨五入したいです。 1000000倍して0.5足して切り捨てる やり方が載っていました。 しかし1000000倍した時に誤差で「.3999999」となる ことがあるようです。 どうやったら回避できるのでしょうか。

  • 関数式

    末尾5の時は5の前の数字が偶数なら切り上げ、奇数なら切捨て。末尾5以外は末尾を四捨五入 1235→1200 ・ 12345→12400 ・ 1234→1230 になる関数式を教えてください。

  • 五捨五入(偶捨奇入)の数学的意義と四捨五入との関係

    四捨五入は、端数が0.5のとき常に増える方向に丸められるため、わずかに正のバイアスがある。そのときは、五捨五入が「望ましい」とされている。 バイアスがないのが特徴である(データがランダムなら)。このため、多数足し合わせても丸め誤差が累積しない。 ということが書かれてあったのですが、データの数学的意味がわかりません。四捨五入と五捨五入のそれぞれにデータによる意味合い(定義ではない)とか役立ち方の違いがあると思うのですが、その違いはどういうことなのでしょうか? また、五捨五入とは、小数点以下の端数処理を行うとき、小数点以下の値が 0.50 ピッタリの時、一番距離の近い偶数に丸めるということなのですが、それをガウス記号(floor関数)で書くとどうなるのでしょうか? ちなみにrの小数点以下の四捨五入は、[r+0.5]

  • エクセルの偶数行(奇数行)の抽出

    エクセルにある数値列が入力されています。 この列の偶数行もしくは奇数行だけを抽出したいと考えていますが、どのような方法があるでしょうか?

  • javascriptで四捨五入して小数点第1位表示で計算値が10になった場合、10.0と表示したい0表示にする方法

    利率計算を作成していて、問題が発生したため、質問します。 以下ような計算式で、四捨五入し、小数点第1位表示まで 出来たのですが、計算値が整数になってしまった場合、 10と表示されます。これを何とか、整数値になった場合、 10.0と表示させたいのですが、良い方法があれば、 ご伝授いただければと思います。 ritu = Math.round( ritu * 1000 ) / 10; //小数点第1位表示四捨五入して代入