Neslib.MultipRecision添加了另外兩種供Delphi使用的浮點類型。這些提供的精度最高4倍,比Double類型的精度高4倍。
Neslib.MultipRecision建立在QD 2.3.22之上,並在以下操作:
用於這些類型的算法是由David H. Bailey,Yozo Hida和Xiaoye S. Li開發的。如果您對詳細信息感興趣,請查看C子目錄中的QD.pdf文件。
安裝:
> git clone https://github.com/neslib/Neslib.MultiPrecision該庫對其他庫沒有依賴性。也沒有運行時間依賴性。使用對象文件或靜態庫將基礎C/C ++ QD庫鏈接到可執行文件中。
該庫定義了另外兩種浮點類型:
DoubleDouble :這是一種128位類型,其精度是Double類型的兩倍。QuadDouble :這是一種256位類型,其精度是Double類型的四倍。兩種類型的範圍與雙重類型相同(大約±10 308 ),但精度更高。與Single和Double相比:
| 類型 | 指數 位元 | 尾數 位元 | 精確 (十進制數字) |
|---|---|---|---|
| 單身的 | 9 | 24 | 7 |
| 雙倍的 | 12 | 53 | 16 |
| doubleduble | 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 ,isInfinity,isnegatientInfinity, IsNegativeInfinity ,IseponiverInfinity,ispostiveinfinity,tostring, IsPositiveInfinity , ToString , Parse和TryParse )。有一些方法和運算符可以轉換為Double , DoubleDouble , QuadDouble和String 。
由於Delphi語言不允許您在源代碼中輸入高精度浮點文字,因此必須以其他方式初始化DoubleDouble或QuadDouble變量的值。有多種選項(假設DD在此處類型為DoubleDouble ):
Init過載之一。例如, 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庫增加了系統中發現的功能的許多等效物。系統性和系統。
| 姓名 | 描述 |
|---|---|
| strtodoubeduble,strtoquadduble, strtodoubledef,strtoquaddoubledef, Trystrtofloat | 轉換為字符串 |
| floattostr,floattostrf | 轉換為字符串 |
| 逆 | 計算倒數 |
| REM | 計算剩餘,四捨五入到最近 |
| Divrem | 計算劃分的結果,包括剩餘 |
| fmod | 計算剩餘,朝零舍入 |
| SQRT,SQR | 平方根和正方形 |
| 毛,地板,天花板,圓形 | 各種舍入方法 |
| 腹肌 | 絕對值 |
| 最小值 | 返回最小值或最大值 |
| inrange,nerurange | 比較範圍 |
| samevalue | 近似平等檢查 |
| 功率,intpower,nroot,ldexp,exp | 指數函數 |
| LN,LNXP1,LOG2,LOG10,LOGN | 對數函數 |
| 罪,cos,sincos,棕褐色 | 三角函數 |
| Arcsin,Arccos,Arctan,Arctan2 | 反三角函數 |
| Sinh,Cosh,Sincosh,Tanh | 雙曲線功能 |
| 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 | 從畢業生轉換 |
| 環源性,環發行,環胎 | 從周期轉換 |
證明高精度數學的一種有趣方法是計算Mandelbrot分形。當您放大分形時,您需要越來越精確。樣品子目錄包含一個firemonkey應用程序,該應用程序以4個級別的精度( Single , Double , DoubleDouble和QuadDouble )生成mandelbrot分形。
以下圖像顯示了分形的一小部分,使用1倍的倍倍(10 15 ,又稱歐洲的一個台球)和Double精度:

您可以清楚地看到, Double類型在此放大級別上不能提供足夠的精度。 DoubleDouble類型提供了足夠的精度:

直到您達到10 31的放大率,您才需要切換到QuadDouble 。
neslib。多重分配要比上述更大。有關更多詳細信息,您可以查看已記錄的Neslib.MultiPrecision.pas源文件。可以在Unitests子目錄和Mandelbrot樣本應用程序中找到其他用法樣本。
如果您對這些類型的技術細節和算法感興趣,可以查看C子目錄中的QD.pdf文件。
如上所述,該庫建在QD庫的頂部。這是一個C/C ++庫,使用對象文件或靜態庫鏈接到您的Delphi可執行文件中。如果您自己需要或想自己構建這些對象文件和靜態庫,請查看C子目錄中的readme.txt文件以獲取說明。
Neslib.MultipRecision已根據簡化的BSD許可獲得許可。有關詳細信息,請參見License.txt。
底層QD庫是根據BSD-LBNL許可證獲得許可的。有關詳細信息,請參見C子目錄中的文檔BSD-LBNL-LICENSE.DOC。