[ 前へ | 目次 | 次へ ]

桁数の設定と演算精度

ここでは、計算桁数の設定や、 VF モード ON /OFF 時の演算精度について説明します。リニアンプロセッサーは、VFモードを使用する事で、数千桁の高精度演算も扱う事ができます。


桁数の設定、VFモードのON/OFF切り替え

リニアンプロセッサーを起動した時点では、最終的に出力される桁数は10桁に設定されています。この桁数は、OUTPUTエリアの上にある「 DIGIT 」項目で設定できます。( 下図参照 )

また、その左の「 VF-MODE 」項目で、VFモード ( 下記参照 ) を切り替える事ができます。

VFモードのON/OFFと演算精度など

さて、様々な桁数や用途で正確な計算を行うために、場合によっては VFモード ( 10進数多倍長演算モード ) の使用が適している事があります。

VFモードのON/OFF時では、リニアンプロセッサーの内部処理が大きく異なります。それぞれ長所と短所がありますので、正しく理解し、用途に応じて使い分けてください。詳細は下表の通りです。

VFモードOFF VFモードON
概要 内部処理に64bitの2進数が使用されます。最大16桁まで扱えます。非常に高速ですが、16桁の末尾付近に、2進数演算に特有の誤差などが生じます。数学関数は軽快で正確です。 内部処理に任意桁数の10進数が使用されます。何桁でも扱えます。非常に高精度ですが、大きな桁数では、処理速度が大きく低下します。数学関数は独自開発ライブラリのため、重く、精度も完全ではありません。
内部処理 64bit / 2進数演算 多倍長, 10進数演算
演算精度(桁) 限界で16〜18桁程度、信頼できるのは14桁程度、安全マージンを取ると10桁程度 任意桁数
想定すべき誤差など 10進/2進変換に特有の誤差などに注意が必要です。14〜16桁程度の数桁には常に誤差が含まれると考えるべきです。 末尾桁の処理は切り捨てなので、切り捨て誤差が生じます。
演算速度 100 M FLOPS程度( 数億回 / 秒 ) 最大1 M FLOPS程度( 最大数百万回 / 秒 ) / 桁数が大きくなると遅くなり、除算の演算時間は桁数の2乗で効いてくる
数学関数 開発言語の組み込み関数を使用しているため、非常に高速であり、かつ正確です。 歴史の浅い、独自開発のライブラリを使用しているため、比較的低速であり、精度も完全ではありません。厳密性を要する場合は、適当な数値でテストする事が推奨されます。

実際には、設定桁数よりも大きな桁数で演算され、四捨五入される

さて、上の表では、精度や誤差など、面倒な点が色々と記載されていますが、起動時に標準で設定されている10桁程度の計算であれば、このような点はあまり気にしなくても良いでしょう。

なぜならリニアンプロセッサーは、内部処理では設定桁数よりも大きな桁数で演算を行い、結果を設定桁数に四捨五入して、OUTPUTエリアに出力してくれるからです。

例えば、VFモードOFF時の10桁で、以下の数式を計算してみましょう。

- INPUT -

1.01 - 0.001

- OUTPUT -

1.009000000

- CONSOLE -

1.01-0.0010
[ 1.01-0.0010 = 1.0090000000000001 ]
1.0090000000000001

さて、CONSOLEエリアに注目してください。この場合、内部処理では17桁の結果が得られた事が分かります。そして、その最終桁は、本来「 0 」であるべきなのに「 1 」になっている事が見て取れます。これは一般に桁落ち誤差と呼ばれ、有名な演算誤差の一種です。こういった誤差は、内部処理における末尾桁の数桁まで影響する可能性があります。

しかしながら、結果は10桁まで四捨五入されたため、正確な値が得られた事が分かります。

大きな桁数と精度が必要な場合は、VFモードを使う

VFモードOFF時には、内部処理でも最大で16〜18桁までしか扱えないため、10桁よりも大きい桁数で計算させる際は注意が必要です。極端な例では、VFモードOFF時に16桁などで計算させると、桁数がギリギリで四捨五入の余地が無くなってしまい、誤差が結果に見える領域に現れる可能性があります。

どうしてもそのような大きな桁数を扱いたければ、VFモードを使う事が推奨されます。VFモードでは、内部処理で無制限に桁を使えるため、ちゃんと安全マージンを取って計算した上で四捨五入する事ができます。

実際、先ほどの例では、VFモードON時の場合、16桁に設定しても内部では21桁程度で計算され、16桁に四捨五入されます。

また、VFモードでは数千桁の計算も扱う事ができます。例として、VFモードをONにし、桁数を1000桁に指定して、以下の数式を計算してみてください。( 少し時間がかかります )

- INPUT -

sin(1)**2 + cos(1)**2

- OUTPUT -

1.0...( 1000桁続く )

このように、1000桁の正しい値を得る事ができました。ただし、VFモードON時における数学関数の処理には、まだ歴史の浅い、独自開発のライブラリが使用されています。そのため、あらゆる入力値と桁数について、精度が完全に確認されているわけではありません。

厳密性を要求されるような場面では、上のように結果が分かっている数式を用いて、予め動作検証を十分に行う事が推奨されます。



スポンサーリンク


スポンサーリンク

この階層の目次
お知らせ

Vnanoのソースコードと開発リポジトリをGitHubで公開
2018年09月30日 - 現在開発中の、ソフトウェア上でのスクリプト処理用途に向けた小型・軽量スクリプトエンジン「 Vnano 」のソースコード&リポジトリを公開しました。ビルド・使用方法や、現状の段階と今後などを解説します。

リニアングラフ3D&2D Ver.5.6 リリース! Java言語のプログラムからも制御可能に
2018年08月19日 - 約5年ぶりの大きなバージョンアップを迎えた、新しいリニアングラフ Ver.5.6の特徴をご紹介します。UIがリファインされ、Java言語でグラフ描画ライブラリとして使う事も可能になりました。

ライセンスの緩和方向への改訂を実施、条件を満たす場合のソフトの再配布などが可能に
2018年07月16日 - RINEARNでは2018年7月に、ソフトウェアライセンスの緩和方向への改訂を実施しました。新ライセンスでは、いくつかの条件を満たす場合において、ソフトの再配布などが無申請で可能になりました。

コードアーカイブ新着
配列を3Dグラフにアニメーションプロットする(点/線グラフ)

座標値配列の内容を、3次元の点/線グラフに連続でプロットし、アニメーションさせるサンプルプログラムです。
2018年11月14日
配列を2Dグラフにアニメーションプロットする

座標値配列の内容を、2次元グラフに連続でプロットし、アニメーションさせるサンプルプログラムです。
2018年11月13日
配列を3Dグラフにプロットする(曲面/メッシュグラフ)

座標値配列の内容を、3次元の曲面/メッシュグラフにプロットするサンプルプログラムです。
2018年11月12日
ファイルを3Dグラフにプロットする(曲面/メッシュグラフ)

座標値ファイルの内容を、3次元の曲面/メッシュグラフにプロットするサンプルプログラムです。
2018年11月11日
連番画像をアニメーション再生する簡易ツール

フォルダ内の連番画像ファイルを、動画への変換不要で、そのままアニメーションとして再生できる簡易ツールです。
2018年09月04日
公式Twitterアカウント

スポンサーリンク