2016/05/21(土)カシオの関数電卓の奇妙な挙動
123456789123456 - 123456789121111 = 2345非常に近い2つの数同士の引き算を行なうと、「桁落ち」と呼ばれる有効数字の減少が発生します。これは有限精度の計算を行っている以上仕方のないことですが、どうやらこの関数電卓では、
123456789123456 - 123456789123111 = 345
123456789123456 - 123456789123411 = 0 (45でない!)
「減算で桁落ちが発生した結果有効数字が2桁以下になったとき、その数を強制的に0に書き換える」という仕様になっているようです。桁落ちが起きるような厳しい計算こそ高精度な電卓の助けが欲しいところなのに、そこでわざわざかろうじて残った情報を捨て去ってしまうというのは極めて不可解な仕様だと感じます。
この仕様で困ってしまう場面はいくらでもありそうですが、一つ例を作ってみました。2次方程式
0.9999996 x2 - 2x + 1.0000004 = 0の解をいわゆる2次方程式の解の公式で計算してみます。判別式の値は、
4 - 4 × 0.9999996 × 1.0000004ですが、この値が
= 4 - 3.99999999999936
= 0.00000000000064
= 6.4 × 10-13
4 - 3.99999999999936 = 0となってしまいます。3.99999999999936を正しく格納できる仮数部を持っているにも関わらず、です。実にもったいない仕様だとは思いませんか。素直な10進数15桁の演算ならば、
sqrt(6.4 × 10-13) = 8 × 10-7のようにほぼ正確に計算できたはずなのに、
x1 = (2 - 8×10-7)/2/0.9999996 = 1
x2 = (2 + 8×10-7)/2/0.9999996 ≈ 1.000000800000032
x1 ≈ 1.00000040000016のような重解になってしまいます。また、手作業で解の公式を使って計算した場合のみならず、関数電卓に組み込まれた2次方程式ソルバーを使っても全く同じ計算結果が得られました。すなわち、ユーザに直接見える部分のみならず、内部の演算ルーチンそのものがこの仕様に蝕まれていることは確実と思われます。
x2 ≈ 1.00000040000016
この仕様はカシオfx-5800Pに特有のものなのか、他の機種にも見られるものなのか、ヨドバシカメラの関数電卓売り場の展示機を触って調べてみました。すると、
機種名 | 仮数部の桁数 | 桁落ち時に捨てられる桁数 |
---|---|---|
カシオ fx-5800P/JP900/FD10Pro/375ES/72F | 15 | 2 |
キヤノン F-789SG | 18 | 2 |
キヤノン F-715SA | 16 | 3 |
シャープ EL-509M | 14 | 1 |