Neslib.multiprecision เพิ่มสองประเภทลอยเพิ่มเติมสำหรับใช้กับ Delphi ข้อเสนอเหล่านี้มีความแม่นยำซึ่งมีขนาดใหญ่กว่าประเภท Double
Neslib.Multiprecision สร้างขึ้นที่ด้านบนของ QD 2.3.22 และทำงานบน:
อัลกอริทึมที่ใช้สำหรับประเภทเหล่านี้ได้รับการพัฒนาโดย David H. Bailey, Yozo Hida และ Xiaoye S. Li ลองดูไฟล์ qd.pdf ในไดเรกทอรีย่อย C หากคุณสนใจรายละเอียด
ในการติดตั้ง:
> git clone https://github.com/neslib/Neslib.MultiPrecisionห้องสมุดนี้ไม่มีการพึ่งพาห้องสมุดอื่น ๆ นอกจากนี้ยังไม่มีการพึ่งพาเวลาทำงาน ไลบรารี C/C ++ QD พื้นฐานเชื่อมโยงกับปฏิบัติการโดยใช้ไฟล์วัตถุหรือไลบรารีคงที่
ห้องสมุดนี้กำหนดสองประเภทลอยเพิ่มเติม:
DoubleDouble : นี่คือประเภท 128 บิตที่มีความแม่นยำสองเท่าของประเภท Double เท่าQuadDouble : นี่คือประเภท 256 บิตที่มีความแม่นยำสี่เท่าของประเภท Double ทั้งสองประเภทมีช่วงเดียวกันกับประเภทสองเท่า (ประมาณ± 10 308 ) แต่มีความแม่นยำสูงกว่ามาก เมื่อเทียบกับ Single และ Double :
| พิมพ์ | ตัวแทน บิต | Mantissa บิต | ความแม่นยำ (ตัวเลขทศนิยม) |
|---|---|---|---|
| เดี่ยว | 9 | 24 | 7 |
| สองเท่า | 12 | 53 | 16 |
| สองเท่า | 12 | 106 | 32 |
| เป็นสี่เท่า | 12 | 212 | 64 |
ชื่อ
DoubleDoubleและQuadDoubleมาจากห้องสมุด QD พื้นฐาน ฉันพิจารณาการตั้งชื่อFloat128เหล่านี้และFloat256แทน แต่มีข้อกำหนด IEEE อย่างเป็นทางการสำหรับประเภท (ฮาร์ดแวร์) ดังกล่าวอยู่แล้ว และเนื่องจากสิ่งเหล่านี้ไม่สามารถใช้งานได้กับDoubleDoubleและQuadDoubleฉันจึงไม่ต้องการเพิ่มความสับสน
ไลบรารี QD พื้นฐาน ไม่ได้ ใช้การจำลองสำหรับการคำนวณ แต่จะใช้ความสามารถในการลอยตัวที่มีอยู่ของ CPU เพื่อใช้ค่า 2 หรือ 4 Double เพื่อเพิ่มความแม่นยำ เป็นผลให้ประเภทเหล่านี้เร็วกว่าไลบรารีคณิตศาสตร์ที่มีความแม่นยำสูง/สูงอื่น ๆ โดยใช้ความแม่นยำเดียวกัน นอกจากนี้เมื่อเทียบกับไลบรารีอื่น ๆ ประเภทเหล่านี้ไม่จำเป็นต้องมีการจัดสรรหน่วยความจำแบบไดนามิกซึ่งจะช่วยเพิ่มประสิทธิภาพและลดการกระจายตัวของหน่วยความจำ
ประเภท DoubleDouble และ QuadDouble สามารถใช้งานได้ในลักษณะเดียวกับประเภท Double พวกเขารองรับตัวดำเนินการปกติ ( + , - , * , / , = , <> , < , <= TryParse > และ >= ) เช่นเดียวกับวิธี IsNegativeInfinity ส่วนใหญ่ที่มีให้สำหรับผู้ช่วย ToString สำหรับ Parse Double IsPositiveInfinity IsNan , IsInfinity มีวิธีการและตัวดำเนินการในการแปลงไปและกลับจาก Double , DoubleDouble , QuadDouble และ String
เนื่องจากภาษา Delphi ไม่อนุญาตให้คุณป้อนตัวอักษรจุดลอยตัวที่มีความแม่นยำสูงในซอร์สโค้ดค่าของตัวแปร DoubleDouble หรือ QuadDouble จะต้องเริ่มต้นด้วยวิธีอื่น มีตัวเลือกต่าง ๆ (สมมติว่า DD เป็นประเภท DoubleDouble ที่นี่):
Init overloads ตัวอย่างเช่น DD.Init(1.23); เพื่อเริ่มต้น DoubleDouble จาก DoubleDD := DoubleDouble(1.23); -DD := DoubleDouble.Pi; -DD := '3.1415926535897932384626433832795'; -ฉันไม่ได้เพิ่มตัวดำเนินการ โดยนัย เช่น
DD := 1.23;เนื่องจากสิ่งเหล่านั้นสามารถนำไปสู่การแปลงที่ไม่ได้ตั้งใจที่ส่งผลกระทบต่อประสิทธิภาพ
เป็นสิ่งสำคัญที่คุณจะต้องเรียก MultiPrecisionInit ก่อน ทำการคำนวณ DoubleDouble / QuadDouble ใด ๆ สิ่งนี้เตรียม FPU/CPU สำหรับคณิตศาสตร์ที่มีความแม่นยำสูง คุณสามารถใช้ MultiPrecisionReset เพื่อกู้คืน FPU/CPU ให้อยู่ในสถานะก่อนหน้า
การกำหนดค่าเริ่มต้นของไลบรารีเหมาะสำหรับแอปพลิเคชันส่วนใหญ่ การกำหนดค่านี้เสียสละความแม่นยำเล็กน้อยเพื่อเพิ่มความเร็ว หากความแม่นยำมีความสำคัญมากกว่าความเร็วสำหรับวัตถุประสงค์ของคุณคุณสามารถรวบรวมไลบรารีด้วยการกำหนด MP_ACCURATE สิ่งนี้จะทำให้การคำนวณจำนวนมากช้าลงเล็กน้อย แต่แม่นยำยิ่งขึ้น
ไลบรารี QD พื้นฐาน (และห้องสมุดนี้) รองรับฟังก์ชั่นทางคณิตศาสตร์ทั่วไปที่หลากหลาย นอกจากนี้ไลบรารี Neslib.multiprecision เพิ่มฟังก์ชั่นที่เทียบเท่ากันมากมายที่พบใน System.Sysutils และ System.math Units
| ชื่อ | คำอธิบาย |
|---|---|
| strtodoubledouble, strtoquaddouble, strtodoubledoubledef, strtoquaddoubledef, trystrtofloat | แปลงจากสตริง |
| floattostr, floattostostrf | แปลงเป็นสตริง |
| ผกผัน | คำนวณซึ่งกันและกัน |
| rem | คำนวณส่วนที่เหลือการปัดเศษให้ใกล้ที่สุด |
| การแบ่งแยก | คำนวณผลลัพธ์ของการแบ่งรวมถึงส่วนที่เหลือ |
| fmod | คำนวณส่วนที่เหลือปัดเป็นศูนย์ |
| sqrt, sqr | สแควร์รูทและสแควร์ |
| Trunc, พื้น, เพดาน, รอบ | วิธีการปัดเศษต่างๆ |
| เอบีเอส | ค่าสัมบูรณ์ |
| นาทีสูงสุด | ส่งคืนค่าต่ำสุดหรือสูงสุด |
| Inrange, ensurerange | เปรียบเทียบกับช่วง |
| samevalue | การตรวจสอบความเท่าเทียมกันโดยประมาณ |
| พลัง, intpower, nroot, ldexp, exp | ฟังก์ชั่นเอ็กซ์โปเนนเชียล |
| ln, lnxp1, log2, log10, logn | ฟังก์ชั่นลอการิทึม |
| บาป, cos, sincos, tan | ฟังก์ชั่นตรีโกณมิติ |
| 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 | แปลงจากผู้สำเร็จการศึกษา |
| Cycletorad, Cycletodeg, cycletograd | แปลงจากรอบ |
วิธีที่สนุกในการสาธิตคณิตศาสตร์ที่มีความแม่นยำสูงคือการคำนวณเศษส่วนของแมนเดลบอต ในขณะที่คุณซูมเข้าไปในเศษส่วนคุณต้องมีความแม่นยำมากขึ้นเรื่อย ๆ ไดเรกทอรีย่อยตัวอย่างมีแอปพลิเคชั่น FireMonkey ที่สร้าง Fractal Mandelbrot ที่ความแม่นยำ 4 ระดับ ( Single Double DoubleDouble และ QuadDouble )
ภาพต่อไปนี้แสดงส่วนเล็ก ๆ ของเศษส่วนโดยใช้กำลังขยายหนึ่งสี่พันล้าน (10 15 , aka หนึ่งบิลเลียดในยุโรป) และความแม่นยำ Double :

คุณสามารถเห็นได้อย่างชัดเจนว่าประเภท Double ไม่ได้ให้ความแม่นยำเพียงพอในระดับการขยายนี้ ประเภท DoubleDouble มีความแม่นยำมากเกินพอ:

มันไม่ได้จนกว่าคุณจะถึงระดับการขยาย 10 31 ที่คุณต้องเปลี่ยนเป็น QuadDouble
มี Neslib.Multiprecision มากกว่าที่อธิบายไว้ข้างต้น สำหรับรายละเอียดเพิ่มเติมคุณสามารถดูได้ที่ไฟล์ต้นฉบับ Neslib.MultiPrecision.pas ตัวอย่างการใช้งานเพิ่มเติมสามารถพบได้ในไดเรกทอรีย่อย Unittests และแอปพลิเคชันตัวอย่าง Mandelbrot
หากคุณสนใจในรายละเอียดทางเทคนิคและอัลกอริทึมที่ใช้สำหรับประเภทเหล่านี้คุณสามารถดูไฟล์ qd.pdf ในไดเรกทอรีย่อย C
ดังที่ได้กล่าวไปแล้วห้องสมุดนี้สร้างขึ้นที่ด้านบนของห้องสมุด QD นี่คือไลบรารี C/C ++ ที่เชื่อมโยงกับ Delphi ที่เรียกใช้งานได้โดยใช้ไฟล์วัตถุหรือไลบรารีคงที่ หากคุณต้องการหรือต้องการสร้างไฟล์วัตถุเหล่านี้และไลบรารีคงที่ด้วยตัวคุณเองให้ดูที่ไฟล์ readme.txt ในไดเรกทอรีย่อย C สำหรับคำแนะนำ
Neslib.Multiprecision ได้รับอนุญาตภายใต้ใบอนุญาต BSD ที่ง่ายขึ้น ดู License.txt สำหรับรายละเอียด
ไลบรารี QD พื้นฐานได้รับอนุญาตภายใต้ใบอนุญาต BSD-LBNL ดูเอกสาร bsd-lbnl-license.doc ในไดเรกทอรีย่อย C สำหรับรายละเอียด