- 締切済み
Excelの引き算の答えについて。
エクセルで「=500-498.2」と入力すると、そのセルには「1.8」になるのですが、そのセルを値のみコピーにすると「1.80000000000001」になります。 いろいろ試してみたところ、 10-9.8=0.199999999999999 1400-1396.3=3.70000000000005など、位が少なくなるときにおこるようです。 これは、バグなのかわざとなのかどちらでしょうか。 別に今現在困っているというわけではないのですが、偏差値の計算をしているときに偶然答えが0になるはずのところが10のマイナス乗で表示されたので、気持ち悪くて・・・(笑) 単純に知りたいだけです。 バグじゃないとしたら、どういう理屈、条件でこのような計算結果を返すのか教えてください。 ちなみに、MacとWindows両方のOSで確認されました。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
原因は、演算処理を速めるために、小数点演算は、倍精度浮動小数点型の数字を2進で行い、最近接偶数丸めが行われているから、誤差が発生するのだ、ということですが、当然、ワークシート上は、ある程度の補正処理がなされているということです。 しかし、『安易に丸め誤差には結び付けないほうがよい』ということを言わせていただきます。 つまり、演算誤差ではないということです。 私は、数年の間、以下の文面の[引き算や割り算]=[演算の一部]と間違った理解をしていました。 「原則:×[小数点を含む、引き算や割り算は、]-->○[すべての小数点は演算しなくても、]丸め誤差が発生することがあります。関数のMOD,CEILING,FLOOR に、見かけ上は、引き算はなくても、小数点を用いると誤差が発生することがあります」 日経BP21で、昔、芳坂氏がセンセーショナルな内容の「浮動小数点の丸め誤差」についての記事を書きましたが、当時の彼は、それほど詳しくなかったようですし、また、Microsoft の提灯持ちのような記事に、大した内容があるわけではありません。まして、記事の結論が、VBAのユーザー定義関数での処理では、あまり関心しませんでした。インターネットに繋げられる限りは、記事を書く前に、もう少し文献なりを読んで、まとめることが必要だったと思いますし、基本的な用語のミスは訂正すべきだったと思います。 彼の記事で書かれていない基本的なことで、これは、マイクロソフト側のMSDNに出てきますが、対処法には、整数法、小数点固定法の二つがあります。 整数法 =(500*10-498.2*10)/10 小数点固定法 =VALUE(FIXED(500-498.2)) http://support.microsoft.com/kb/78113/ja つまり、この文章には、疑問符がつくということです。各社各様に、表計算の誤差に対処していたけれども、過去可能であって、現在のMicrosoft が出来なかったのは、IBMの確執に原因があるのではないか、と推測しています。 A1: B1: 0.375111 --> =ROUNDUP(A1,6) --結果 0.375112 A1: 0.374111 --> 〃 --結果 0.75111 Excel 2003では発生する、 Excel2007では修正済み これでは、ROUND関数による四捨五入は不可能だということになります。最近接偶数丸めによるものですが、果たして、ワークシートにそのようなものが関係あったのか疑問です。もし、単に、浮動小数点演算誤差だけの問題なら、発生するはずがありません。 B.D. McCullough, David A. Heiser 共著の論文で、"On the accuracy of statistical procedures in Microsoft Excel 2007"(Computational Statistics & Data Analysis)にも出ていますが、前製品のExcel 2007は、3つの分野の標準的中程度・精度テストには通らなかったと報告されています。 {Excel 2007, like its predecessors, fails a standard set of intermediate-level accuracy tests in three areas...} http://www.jstatsoft.org/v34/i04 On the Numerical Accuracy of Spreadsheets 現在のCPUでは、演算処理が速いので、10進に計算させても、ほとんど私たちの感覚では区別がつかないはずです。当初のExcelの開発者も今はいないし、ただ、インターフェースだけを換えて、十数年以前の製品を使わされている可能性が高いように思います。 何の解決にもなりませんが、三重大教授というよりも、PC-Van やTex で有名な奥村晴彦さんが、以下で触れています。
- mu2011
- ベストアンサー率38% (1910/4994)
コンピュータの演算は2進数で行われる事はご存知と思います。 よって、10進小数を2進数(2^-1(0.5)・2^-2(0.25)・2^-3(0.125)・・・)で表現する為、近似値になるから正確に表示できませんがバグではありません。 関連情報のサイトを紹介しますのでご確認下さい。
- MackyNo1
- ベストアンサー率53% (1521/2850)
原因は2進数で表せない数字の演算で出てくる浮動小数点誤差(丸め誤差)によるものです(バグではありません)。 http://support.microsoft.com/kb/78113/ja 丸め誤差が出るケースでは、以下のようにROUND関数を適宜組み合わせて対処してください。 =ROUND(元の計算式,10)