Excel 2007に乗算のバグが発見される 50
ストーリー by GetSet
いやぁん 部門より
いやぁん 部門より
あるAnonymous Coward 曰く、
Slashdot本家に衝撃的なMS Excel 2007のバグの 記事が掲載されている。
確認は簡単なようだ。=850*77.1を計算させてみると、100,000となるらしい。
このバグは、乗算の結果が65,535になるときに発生するようで、おそらく2進法と10進法の変換過程での バグがあるのだろう。実に興味深い。
Microsoftのコメント (スコア:5, 参考になる)
I'm out of my mind, but feel free to leave a comment.
Re:Microsoftのコメント (スコア:3, おもしろおかしい)
一般ぴーぷる向けソフトでそんな言い訳、、、、
釣られないクマー(AA略
「計算内容は間違っていないが」って成績表を見せるときの新しい言い訳パターンだね
Re:Microsoftのコメント (スコア:2, すばらしい洞察)
計算内容が間違っていない場合は今後パッチを当てれば正しく表示されますが、
計算内容が間違っている場合は今まで作成したデータを総点検する必要があるでしょう。
表示が重要はそのとおりですが、それ以上にデータのほうが重要です。
Re:Microsoftのコメント (スコア:1)
データ (計算) と表示のどちらがより重要かという問題ではないと思います。計算部分にバグがあった場合に総点検の必要があるというなら、今回の表示部分のバグにしても、今までに Excel 2007 で作成して印刷したデータや、 Excel 2007 で作成したデータを画面で見てそれをもとに下した判断を総点検する必要があるわけですから。
なお、 #1225749 [srad.jp] でも書きましたが、 Excel 開発者のブログではべつに「表示部分のバグだから計算部分のバグほど重大ではない」とは主張していません。
Re:Microsoftのコメント (スコア:1)
しかし、問題の対象者を誰にするかで話は変わります。
ユーザーにとってどこにバグがあるかはとても重要な問題です。
バグの内容により対応は変わりますし、ユーザーにとって計算部分のバグの方が影響は大きいでしょう。
# 計算結果をCSVとして出力したり値としてコピーする等の影響のある操作をしていなければ大差ないかもしれません。
また、重要な意思決定にExcel 2007を使用していたのであれば、過去の印刷物や意思決定を見直す必要があるでしょう。
見直すかどうかは、バグに遭遇する確率、見直す手間、その意思決定の重要度等を総合的に検討して決めることになります。
# 表示に問題があるファイル(このバグが再現したファイル)を探すスクリプトを使うと確認の手間を効率化できますね。
Re:Microsoftのコメント (スコア:1)
必ずしもそうとは言えないと思いますが、言われてみると早い段階 (計算部分) のバグの方が、遅い段階 (表示部分) のバグより影響が大きくなる傾向があってもおかしくないというのは納得できました。ありがとうございます。
それは、まったくその通りだと思います。
Re:Microsoftのコメント (スコア:1)
バグが計算部分ではなく表示部分にあるというのは、バグの重要度の評価ではなくて、単なるバグの説明です。計算部分でないから重大でない、などとは誰も言っていません。
このバグの発生条件はわかりにくいです。挙動だけ見ていてもほとんど何もわかりません。一般に、どの段階にバグがあるのかという情報は、バグの発生条件を知る上で重要です。 U-Chan さんのコメント [srad.jp]にあるように、「=850*77.1」や「=850*77.1+1」ではバグが再現し、この例だけを見ると入力か計算の部分にバグがあるように考えられるのに、「=850*77.1+2」では再現しません。逆に表示部分にバグがあるとしたら、なぜ「=850*77.1+1」でも再現するのか。挙動だけ見ていると謎の多いバグです。
だから、 Excel 開発者のブログではバグの内容を説明する際にまず「これは表示部分のバグだ」と書いてあるのです。
バグの発生条件に興味がない人には、どの段階にバグがあるかなんてどうでもいい情報だと思いますが、バグの説明を読んで勝手に「言い訳している」と解釈するのはやめた方が良いと思います。
Re:言い訳パターン (スコア:0)
すでに「ちゃうねん、本当はわかってんねんで?だけどな~、ごっちゃになるねん」
というのが、大阪さん(春日歩 あずまんが)により使用されています。
それを多少高度に変形すると「計算内容は間違っていないが」となります。
この言い訳を好む人は次の言い訳も好んで使います
「グラフで比較するとPSファミリーは順調に推移している」 [google.co.jp]
Re:Microsoftのコメント (スコア:2, 参考になる)
http://eigyr.dip.jp/diary/200709.html#excel%202007%20%E3%81%8C%E6%8E%9... [eigyr.dip.jp]
Re:Microsoftのコメント (スコア:1)
ここ [srad.jp]を見る限りでは、結果を表示するところだけの問題でもないように思えるけど。
同じセルを参照して計算させるだけで、どうしてこうも違うのかという点で、変なコーディングでもしてるのかと。
/* Kachou Utumi
I'm Not Rich... */
Re:Microsoftのコメント (スコア:0)
実は「ギレを変換するとピカチュウになる」のと同様、不正コピー防止のための手法だったりして ;-P
Re:Microsoftのコメント (スコア:0)
表示してナンボのツールじゃないか。
4年もいじくりまわした結果がこれじゃ、お粗末過ぎる。
Re:Microsoftのコメント (スコア:0)
大丈夫。 (スコア:0)
本家での実証例 (スコア:4, 参考になる)
その時、他のセルでの
=A1+1 は 100,001 になります(65536になってほしい)。
=A1*2 は 131,070 になります(正しい)。
=A1*1 は 100,000 になります(65535になってほしい)。
=A1/1 は 100,000 になります(65535になってほしい)。
=A1/2 は 32767.5 になります(正しい)。
...だそうです。
Re:本家での実証例 (スコア:3, 参考になる)
=A1<65536 "TRUE"
=A1<65535 "FALSE"
=A1<65534 "FALSE"
=A1=65536 "FALSE"
=A1=65535 "TRUE"
=A1=65534 "FALSE"
=A1>65536 "FALSE"
=A1>65535 "FALSE"
=A1>65534 "TRUE"
=A1<100001 "TRUE"
=A1=100001 "FALSE"
=A1>100001 "FALSE"
=A1<100000 "TRUE"
=A1=100000 "FALSE"
=A1>100000 "FALSE"
=A1<99999 "TRUE"
=A1=99999 "FALSE"
=A1>99999 "FALSE"
Re:本家での実証例 (スコア:2, 興味深い)
=850*77.1+0 は 100,000
=850*77.1+1 は 100,001
=850*77.1+2 は 65,537
になります。2を足すと正しくなるのか…。
乗算は本質ではない (スコア:3, 参考になる)
rxk14007 さんが既に紹介 [srad.jp]している Excel 開発者の David Gainer さんのブログ記事 [srad.jp]を読むと書いてあることですが、このバグの本質は乗算とは無関係です。
Excel の内部では数値を倍精度浮動小数点数 [wikipedia.org]で表します。このバグは、セルの計算結果が 65534.99999999995 より大きく 65535 より小さい数 (65535 よりも 1~6 ulp 小さい数) になると 100000 と表示され、 65535.99999999995 より大きく 65536 より小さい数 (65536 よりも 1~6 ulp 小さい数) になると 100001 と表示されるというものです。例えば、「=65535-1/137438953472」と書けばセルの内容が 65535 より 1 ulp 小さい数になるので、バグが再現します (137438953472 は 2 の 37 乗)。
「=850*77.1」でバグが再現するのは、 77.1 が 2 進法で循環小数になるため内部で正確に表せず、その結果乗算の結果が 65535 より 1 ulp 小さい数になるからです。
では、セルに同じ数を直接書いて「65534.9999999999927240423858165740966796875」と書けば再現するかというと、再現しません。 Excel では、セルに数値を入力すると、自動的に入力が (表示ではない) 15 桁までに丸められてしまうからです。これも David Gainer さんのブログ記事に書いてあります。
Re:乗算は本質ではない (スコア:1)
リンク先を間違えました。Excel 開発者の David Gainer さんのブログ記事はこちらです [msdn.com]。
これでまた (スコア:2, おもしろおかしい)
ショッキングというか (スコア:2, 興味深い)
以前よく取りざたされた演算誤差(本家記事 [microsoft.com]、分析記事 [mie-u.ac.jp]、対策紹介 [nikkeibp.co.jp])なんかはどうなったんだろ?
# calc.exeの拡張精度機能(意外に高性能なんだよねぇ)とか、他のソフトにも搭載すればいいのに、と思っても互換性の足かせとかで実現できないんだろうか(いまさらそんなこと言わないで直せばいいんじゃないかという気もするけど)
おれが調べてやるよ (スコア:4, 興味深い)
まずは奥村先生の表 [mie-u.ac.jp]を再現するとこから。 0に落ちるのが早すぎる。
3.77E-15 ≒ 2-48+2-52
4.00E-15 ≒ 2-48+2-52+2-52
4.22E-15 ≒ 2-48+2-52+2-52+2-52
精度は少なくとも2-52まであるが、計算結果が2-48以下になったあたりで意に反して0に修正されている。
括弧で囲んだり、1を掛けたりしても結果は変わらず。
つまり、演算の途中で閾値を割り込むと強制的に0に修正される?
結論
表計算ソフトはやっぱりよく分からん理屈で動いてる
あと、数値計算には使うな
Re:おれが調べてやるよ (スコア:3, 興味深い)
ちなみにUbuntu 7.04/i386, OOo 2.2です。
Re:おれが調べてやるよ (スコア:2, おもしろおかしい)
つまりExcelは仕様書作成ツールであると!
#やーめーてー
これでまた (スコア:0)
Re:これでまた (スコア:1, おもしろおかしい)
Re:これでまた (スコア:0)
演算精度 (Re:ショッキングというか) (スコア:1)
演算誤差自体は、浮動小数点演算を使う以上避けられないもので、どうなったも何もありません。
「分析記事」のリンク先である奥村晴彦さんの「Excel の演算誤差 [mie-u.ac.jp]」で扱っているのは、演算誤差そのものではなく、 Excel では時々計算結果がゼロに「補正」されてしまい、しかもどんな場合に「補正」されるかよくわからない、という問題ですので、誤解のなきよう。倍精度浮動小数点数を使っていれば本来現れるはずの誤差が、この「補正」のせいで現れない場合があります。なぜか OpenOffice.org の Calc については奥村さんと同じ実験をしている人が複数いるのに、このストーリーの主役のはずの Excel 2007 での結果を書いている人がいないので書いておくと、 Excel 2007 でも奥村さんの Excel 2000 での実験結果と変わりません (減算では Excel 2000 の場合と同じ =(1+1.6E-15)-1 以降でゼロになり、式全体を括弧で囲めば本来の通りに誤差が出ます)。
なんと、 Windows 標準の calc.exe では倍精度浮動小数点数より良い精度の演算ができるのですね (Windows XP SP2 で確認)。知りませんでした。昔からそうなのでしょうか。
他のソフトで精度の高い演算が使われない理由は、互換性の問題というよりは、ほとんど必要とされていないからでしょう。何桁使えれば十分かが場合によって違っているので、結局どこかで妥協しなければならないのではないかと思います。妥協する点として、倍精度浮動小数点数を使うのは合理的だと思います。数値計算をすることが主目的のソフトであれば、多倍長計算をして、しかも精度をユーザーが指定できるようにすれば良いのでしょうが、一般的な表計算ソフト等に求められている機能ではないでしょう。
Re:ショッキングというか (スコア:0)
ゼロの近傍でのtanhの精度が悪いのとか、直ってますか?
# エラい人の御筆先であると云う理由で、直すに直せないケース…でないといいなぁ。
Re:ショッキングというか (スコア:0)
Re:ショッキングというか (スコア:0)
# ってことは、バグって「100,000」と表示されたセルをコピーして他のアプリに貼り付けたら正常な表示に戻るのかな?(手元にソフトがないから検証できない)
# にしても、
Re:ショッキングというか (スコア:2, 興味深い)
このばやいも、B1の数値自体は間違っておらず、表示だけがおかしいようですね。表示が異常な状態も引き継がれている?
あと、"=A1-1"は正しく65534でした。
微妙なバグだ……。
Re:ショッキングというか (スコア:1)
・A1をコピーして、OOo CalcのA1に貼り付け
・"Book1.xls"(not xlsx)として保存、Clacで開く
共に65535でした。
#もう何が何だか
小数点も関係するのかな (スコア:1, 参考になる)
850*77.1 = 100000
85*771 = 65535
その他の数字も試してみましたが、整数では起きず
小数点数でも起きる場合と起きない場合が
# 計算順序の関係で、小数が整数扱いになるとダメかな
Re:小数点も関係するのかな (スコア:3, 興味深い)
12850 * 5.1 でも 100000 になる。
ようするに、少数部が .1 になるときに発生するみたい。
やなぎ
字面じゃなく論旨を読もう。モデレートはそれからだ
Re:小数点も関係するのかな (スコア:0)
MSファンとしては (スコア:1)
850*77.1=100,000
で正しいのだ。
Re:MSファンとしては (スコア:2, 興味深い)
Re:MSファンとしては (スコア:0)
Re:MSは850*77.1=100,000が正しい事を証明した (スコア:1, おもしろおかしい)
「この解答に関して、当社は真に驚くべき証明を見つけたが、この余白はそれを書くには狭すぎる [microsoft.com]」
そこらじゅうバグだらけ (スコア:1, 興味深い)
こんなんもでたし。
なに使えばいいんだ? まさかiWorkか? かんべんしてくれ…
それかっ!! (スコア:1)
2007年後半に発売予定 [impress.co.jp]とされていた Office 2008 for Mac [impress.co.jp] の
発売がずれたのは、文字通りWindows版との互換性向上のためなのだろう。
ちなみにiWorkの Numbers でもちゃんと表示されてます。
# きっと別のバグがあるんだろうけど、ユーザー数が少ないから誰も気がつかない
# んだろうな。そっちのほうが怖い。
こんなんじゃ (スコア:1)
に口実を与えちゃうじゃないですか!
各社互換ソフトの互換性テストになりますね! (スコア:0)
Re:各社互換ソフトの互換性テストになりますね! (スコア:0)
Re:各社互換ソフトの互換性テストになりますね! (スコア:0)
ぐぐらずに、記憶で勝負。
Re:各社互換ソフトの互換性テストになりますね! (スコア:0)
# バグ付き版(完全互換版ともいう)はμPD8080AF。
あと、8251Aの送信バッファ制御のバグでもはまったなあ。
これも修正版(8251AF)でやっと解決した。
# 実際に置き換えたのはμPD72051だったかも知れん。
Re:各社互換ソフトの互換性テストになりますね! (スコア:0)
正解、i8085です。一気にアキバから消えたと思ったらi8085Aとして再登場。
i8080とi8080Aの違いは、ピンのレベルの違い、MOSとTTLだったと思いましたが、これは自信無し。