neslib.multiprecisionは、Delphiで使用する2つの追加のフローティングポイントタイプを追加します。これらは、 Doubleタイプの精度よりも最大4倍大きい精度を提供します。
neslib.multiprecisionはQD 2.3.22の上に構築され、次のように機能します。
これらのタイプに使用されるアルゴリズムは、David H. Bailey、Yozo Hida、Xiaoye S. Liによって開発されました。詳細に興味がある場合は、C SubdirectoryのQD.PDFファイルをご覧ください。
インストールするには:
> git clone https://github.com/neslib/Neslib.MultiPrecisionこのライブラリには、他のライブラリに依存関係がありません。ランタイムの依存関係もありません。基礎となるC/C ++ QDライブラリは、オブジェクトファイルまたは静的ライブラリを使用して実行可能ファイルにリンクされます。
このライブラリは、2つの追加のフローティングポイントタイプを定義します。
DoubleDouble :これは、 Doubleタイプの2倍の精度を持つ128ビットタイプです。QuadDouble :これは、256ビットタイプで、 Doubleタイプの4倍の精度があります。どちらのタイプも、二重タイプ(約±10 308 )と同じ範囲を持っていますが、はるかに高い精度です。 SingleとDoubleと比較して:
| タイプ | 指数 ビット | 仮数 ビット | 精度 (小数桁) |
|---|---|---|---|
| シングル | 9 | 24 | 7 |
| ダブル | 12 | 53 | 16 |
| doubledouble | 12 | 106 | 32 |
| Quaddouble | 12 | 212 | 64 |
DoubleDoubleとQuadDoubleという名前は、基礎となるQDライブラリからのものです。代わりに、これらのFloat128とFloat256に名前を付けることを検討しましたが、そのような(ハードウェア)タイプの公式のIEEE仕様はすでにあります。そして、これらはDoubleDoubleとQuadDoubleと互換性がないため、混乱を加えたくありませんでした。
基礎となるQDライブラリは、計算にエミュレーションを使用していません。代わりに、CPUの既存のフローティングポイント機能を使用して、2つまたは4つのDouble値を使用して精度を増加させます。その結果、これらのタイプは、同じ精度を使用して、他の任意/高精度の数学ライブラリよりもはるかに高速です。また、他の多くのライブラリとは対照的に、これらのタイプは動的なメモリの割り当てを必要としないため、パフォーマンスをさらに高め、メモリの断片化を減らします。
DoubleDoubleおよびQuadDoubleタイプは、 Doubleタイプとほぼ同じ方法で使用できます。彼らは、通常の演算子( + 、 - 、 * 、 / 、 = 、 <> 、 < >、<、 <= 、 > 、 >= )と、 Doubleタイプのレコードヘルパー( IsNan 、 IsInfinity 、 IsNegativeInfinity 、 IsPositiveInfinity 、 ToString 、 Parse 、 TryParse )をサポートします。 Double 、 DoubleDouble 、 QuadDouble 、 Stringを変換する方法と演算子があります。
Delphi言語では、ソースコードに高精度の浮動小数点リテラルを入力することはできないため、 DoubleDoubleまたはQuadDouble変数の値は、他の方法で初期化する必要があります。さまざまなオプションがあります(ここではDDがDoubleDoubleタイプであると仮定します):
Initオーバーロードの1つを使用します。たとえば、 DD.Init(1.23); DoubleからDoubleDouble初期化します。DD := DoubleDouble(1.23); 。DD := DoubleDouble.Pi; 。DD := '3.1415926535897932384626433832795'; 。
DD := 1.23;など、暗黙の演算子を追加しませんでした。 、これらはパフォーマンスに影響を与える意図しない変換につながる可能性があるためです。
DoubleDouble / QuadDouble計算を実行する前に、 MultiPrecisionInitを呼び出すことが重要です。これにより、高精度の数学のためにFPU/CPUが準備されます。 MultiPrecisionResetを使用して、FPU/CPUを以前の状態に復元できます。
ライブラリのデフォルト構成は、ほとんどのアプリケーションに適しています。この構成は、速度を向上させるために少し精度を犠牲にします。目的の精度が速度よりも重要である場合は、 MP_ACCURATE定義でライブラリをコンパイルできます。これにより、多くの計算が少し遅くなりますが、より正確になります。
基礎となるQDライブラリ(したがって、このライブラリ)は、さまざまな一般的な数学機能をサポートしています。さらに、neslib.multipRecisionライブラリは、System.sysutils and System.mathユニットに見られる機能の多数の等価物を追加します。
| 名前 | 説明 |
|---|---|
| strtodoubledouble、stroquaddouble、 strtodoubledoubledef、stroquaddoubledef、 Trystrtofloat | 文字列から変換します |
| floattostr、floattostrf | 文字列に変換します |
| 逆 | 相互に計算します |
| rem | 残りを計算し、最寄りに丸めます |
| ディボレム | 残りを含む分裂の結果を計算します |
| fmod | 残りを計算し、ゼロに向かって丸みを帯びます |
| SQRT、SQR | 平方根と正方形 |
| Trunc、床、天井、丸 | さまざまな丸め方法 |
| 腹筋 | 絶対値 |
| 最小、マックス | 最小値または最大値を返します |
| inrange、ensurerange | 範囲と比較してください |
| SameValue | 近似平等チェック |
| パワー、intpower、nroot、ldexp、exp | 指数関数 |
| ln、lnxp1、log2、log10、logn | 対数関数 |
| 罪、cos、sincos、日焼け | 三角関数 |
| Arcsin、Arccos、Arctan、Arctan2 | 逆三角関数 |
| シン、コッシュ、シンコシュ、タン | 双曲線機能 |
| Arcsinh、Arccosh、Arctanh | 逆双曲線機能 |
| cotan、cot、secant、sec、cosecant、csc | 相互の三角関数 |
| coth、sech、csch | 相互双曲線機能 |
| ARCCOT、ARCSEC、ARCCSC | 相互逆三角関数 |
| Arccoth、Arcsech、Arccsch | 相互の逆双曲線機能 |
| radtodeg、radtograd、radtocycle | ラジアンから変換します |
| Degtorad、Degtograd、degtocycle | 学位から変換します |
| GradTorad、GradTodeg、GradTocycle | 卒業生から変換します |
| Cycletorad、Cycletodeg、Cycletograd | サイクルから変換します |
高精度の数学を示す楽しい方法は、Mandelbrot Fractalを計算することです。フラクタルにズームインすると、ますます精度が必要です。サンプルサブディレクトリには、4レベルの精度( Single 、 Double 、 DoubleDouble 、 QuadDouble )でMandelbrot Fractalを生成するFiremonkeyアプリケーションが含まれています。
次の画像は、フラクタルの小さなセクションを示しています(ヨーロッパでは10 15 、別名1つのビリヤード)とDouble精度の拡大を使用しています。

Doubleタイプがこの倍率レベルで十分な精度を提供しないことが明確にわかります。 DoubleDoubleタイプは、十分な精度を提供します。

10 31の倍率レベルに達するまで、 QuadDoubleに切り替える必要があります。
Neslib.MultipRecisionには、上記よりも多くのことがあります。詳細については、十分に文書化されたNeslib.MultiPrecision.pasソースファイルをご覧ください。追加の使用サンプルは、Unittests Sub -DirectoryおよびMandelbrotサンプルアプリケーションで見つけることができます。
これらのタイプに使用される技術的な詳細とアルゴリズムに興味がある場合は、CサブディレクトリのQD.PDFファイルを確認できます。
前述のように、このライブラリはQDライブラリの上に構築されています。これは、オブジェクトファイルまたは静的ライブラリを使用してDelphi実行可能ファイルにリンクされているC/C ++ライブラリです。これらのオブジェクトファイルと静的ライブラリを自分で作成するか、構築する必要がある場合、または作成したい場合は、c Subdirectoryのreadme.txtファイルを指示について見てください。
neslib.multipRecisionは、簡素化されたBSDライセンスの下でライセンスされています。詳細については、license.txtを参照してください。
基礎となるQDライブラリは、BSD-LBNLライセンスの下でライセンスされています。詳細については、C SubdirectoryのドキュメントBSD-LBNL-License.docを参照してください。