Pages、Numbers、Keynote の計算の精度向上について

Pages、Numbers、Keynote をアップデートした後で、書類内の計算結果に若干の違いが認められる場合があります。これは、最新バージョンの iWork で計算エンジンが新しくなり、以前のバージョンよりも計算結果の精度が格段と上がっているためです。

ほとんどの数式では、目に見える違いは生じませんが、計算結果が非常に小さい数値になる場合や、非常に小さい数値を扱う計算では、計算結果の精度が上がる可能性があります。

例 1

以前のバージョンの Numbers、Pages、Keynote では、= 10.0 - 9.8 の計算結果は 0.199999999999999 という値になっていました。

セル内に表示する小数点以下の桁数を変更すると (小数点以下 1 桁〜 14 桁の間)、この問題を回避し、0.2 という予想される結果を表示できます。セル内に表示する小数点以下の桁数を増やすと、0.199999999999999000000000000000 と表示されます。

10 進数を内部表現として 2 進数で記憶するやり方が、その原因です。10 進数を 2 進数に変換する際に、丸め誤差が生じることがあります。Pages、Numbers、Keynote の計算エンジンは常に先進の技術を採用し、こうした誤差が繰り返し足し込まれないようにしていますが、かなり高精度な計算になってくると、誤差の影響を無視できなくなることがあります。

新しい計算エンジンは、数値の 10 進表現をそのまま計算に使う点で、以前のバージョンから劇的な進化を遂げています。

先ほどと同じ計算式 = 10.0 - 9.8 の結果として、数値 0.2 が導き出されるようになっています。小数点以下の桁数を増やしても、「0.2000000000000000000000000000000」と表示されるようになりました。

例 2

以前のバージョンの Numbers では、関数 ROUND(8.415,2)8.41 になっていました。これも、数値を内部的に 2 進数で記憶していることが原因です。

新しい計算エンジンでは、ROUND(8.415,2) が 8.42 になります。

2 進化 10 進数 (BCD) と10 進浮動小数点 (DFP) エンコーディングについて

大半のコンピュータは、数値を 0 と 1 の羅列 (2 進数) で記憶しています。2 進化 10 進数 (BCD) エンコーディングと呼ばれる処理では、小数を 2 進数表記に変換します。数値を BCD でエンコードする際、値によっては、どうしても誤差が生じることがあります。たとえば、0.2 の 2 進表現は 0.001100110011... (繰り返し) になります。BCD でエンコードするには、この値を丸める必要があり、その結果、記憶される値には若干の丸め誤差が生じます。BCD で生じる誤差はかなり小さいものの、ある種の計算を繰り返すことで足し込まれていくと、その誤差も無視できなくなることがあります。

最新バージョンの Pages、Numbers、Keynote は、128 ビットの 10 進浮動小数点 (DFP) エンコーディングで数値をエンコードします。小数をエンコードする方法としてはより精度が高く、BCD エンコーディングにつきものの丸め誤差を回避できます。さらに、新しくなった計算エンジンは、DFP でエンコードされた数値をそのまま計算に使うので、表のセル内の値がさらに高い精度で保存され、数式の計算結果の精度も高くなります。

多くの数式で誤差が現れなくなりますが、計算結果が非常に小さな値になる場合や、非常に小さな値を扱う計算でも、計算結果の精度がさらに上がります。

公開日: