元・国立大学教授のT先生が雑誌に書かれた話です。研究所で実施した研究において、大型コンピュータを使って数値計算をしていた所、結果に疑問がありました。調べてみたら、下記の計算が正しく行われていなかったのが判明しました。
ln2=0
2の自然対数を正しく計算すると、その数値は、0.6931 のはずであり、その大型コンピュータでln2だけを計算すると0.6931と正しく計算します。
最後に気付いたのは、実際の計算においては、ln2ではなく、ln(1.8/0.9)だったことである。そこで今度はln(1.8/0.9)を計算させたところ、なんと0.0という信じられない出力が得らた。2と(1.8/0.9)はコンピュータで用いられる2進法表示で違いが生じるのである。2進法
は数値を1と0の組み合わせで表わし、たとえば10進法の2は10となるが、小数点以下の数
は、1/2,1/4、1/8、、、すなわち0.5、0.25、0.125、、、の組み合わせで表わされる。そのため、小数を含む計算の結果、2進法で10の数値が、1.11,,,1あるいは10.00,,,1となることがある。
要するに本来は切りの良い数字が1bit多いか少ないかというわずかな違いを生じるのである。
我々が把握した間違いを、このコンピュータのメーカに連絡したところ、次のような事実が明かになった。
「倍制度計算で、1bit多いか少ない場合、2だけでなく、2の倍数、つまり2のn乗の自然対数は0になる!」このような特別な条件の場合であるため見逃されていたのだろうが、対数関数は三角関数などとならぶ基本的関数であり、間違いが生じるのはまことに驚くべきことである。
ちなみに、私も自分のパソコンでln2とln(1.8/0.9)を計算してみました。
(1)Excel では、 0.693147181 と9桁を正しく表示しました。
(2)Basic では 0.6931471805599453 と16桁を正しく表示しました。
問題ないことがわかりました。
宅間 菫(たくまただす)「コンピュータも間違える話」電気学会誌」Vol.136 No.2
ln2=0
2の自然対数を正しく計算すると、その数値は、0.6931 のはずであり、その大型コンピュータでln2だけを計算すると0.6931と正しく計算します。
最後に気付いたのは、実際の計算においては、ln2ではなく、ln(1.8/0.9)だったことである。そこで今度はln(1.8/0.9)を計算させたところ、なんと0.0という信じられない出力が得らた。2と(1.8/0.9)はコンピュータで用いられる2進法表示で違いが生じるのである。2進法
は数値を1と0の組み合わせで表わし、たとえば10進法の2は10となるが、小数点以下の数
は、1/2,1/4、1/8、、、すなわち0.5、0.25、0.125、、、の組み合わせで表わされる。そのため、小数を含む計算の結果、2進法で10の数値が、1.11,,,1あるいは10.00,,,1となることがある。
要するに本来は切りの良い数字が1bit多いか少ないかというわずかな違いを生じるのである。
我々が把握した間違いを、このコンピュータのメーカに連絡したところ、次のような事実が明かになった。
「倍制度計算で、1bit多いか少ない場合、2だけでなく、2の倍数、つまり2のn乗の自然対数は0になる!」このような特別な条件の場合であるため見逃されていたのだろうが、対数関数は三角関数などとならぶ基本的関数であり、間違いが生じるのはまことに驚くべきことである。
ちなみに、私も自分のパソコンでln2とln(1.8/0.9)を計算してみました。
(1)Excel では、 0.693147181 と9桁を正しく表示しました。
(2)Basic では 0.6931471805599453 と16桁を正しく表示しました。
問題ないことがわかりました。
宅間 菫(たくまただす)「コンピュータも間違える話」電気学会誌」Vol.136 No.2