กลับไปหน้าบทความ

อ่าน 11 นาที

ความแม่นยำสูงขึ้น

ความแม่นยำแบบขยาย หมายถึง รูปแบบตัวเลข จุดลอยตัว ที่ให้ ความแม่นยำ มากกว่า รูปแบบตัวเลขจุดลอยตัวพื้นฐาน [ 1 ] รูปแบบความแม่นยำแบบขยายรองรับรูปแบบพื้นฐานโดย...

ความแม่นยำสูงขึ้น

ความแม่นยำแบบขยายหมายถึง รูปแบบตัวเลข จุดลอยตัวที่ให้ความแม่นยำ มากกว่า รูปแบบตัวเลขจุดลอยตัวพื้นฐาน[ 1 ]รูปแบบความแม่นยำแบบขยายรองรับรูปแบบพื้นฐานโดยลดข้อผิดพลาดจากการปัดเศษและการล้นในค่ากลางของนิพจน์ในรูปแบบพื้นฐาน ในทางตรงกันข้ามกับความแม่นยำแบบขยายเลขคณิตความแม่นยำตามอำเภอใจหมายถึงการใช้งานประเภทตัวเลขที่ใหญ่กว่ามาก (โดยมีจำนวนพื้นที่จัดเก็บที่โดยปกติไม่ใช่กำลังของสอง) โดยใช้ซอฟต์แวร์พิเศษ (หรือในบางกรณี ฮาร์ดแวร์)

การใช้งานความแม่นยำสูงพิเศษ

รูปแบบเลขทศนิยมแบบขยายมีประวัติความเป็นมาอันยาวนาน ย้อนกลับไปเกือบถึงกลางศตวรรษที่ 20 ผู้ผลิตหลายรายได้ใช้รูปแบบที่แตกต่างกันสำหรับความแม่นยำสูงขึ้นในเครื่องคอมพิวเตอร์แต่ละเครื่อง ในหลายกรณี รูปแบบของความแม่นยำสูงขึ้นนั้นไม่เหมือนกับการขยายขนาดของรูปแบบความแม่นยำเดี่ยวและสองเท่าแบบปกติที่ต้องการขยาย ในบางกรณี การใช้งานเป็นเพียงการเปลี่ยนแปลงรูปแบบข้อมูลเลขทศนิยมด้วยซอฟต์แวร์ แต่ในกรณีส่วนใหญ่ ความแม่นยำสูงขึ้นถูกนำไปใช้ในฮาร์ดแวร์ ไม่ว่าจะสร้างไว้ในหน่วยประมวลผลกลางเอง หรือบ่อยครั้งกว่านั้น คือสร้างไว้ในฮาร์ดแวร์ของหน่วยประมวลผลเสริมที่เรียกว่า " หน่วยประมวลผลเลขทศนิยม " (FPU) หรือ "หน่วยประมวลผลเลขทศนิยม" ( FPP ) ซึ่ง CPUสามารถเข้าถึงได้ในฐานะอุปกรณ์รับ/ส่งข้อมูลความเร็วสูง

รูปแบบความแม่นยำสูงของ IBM

IBM 1130ซึ่งวางจำหน่ายในปี พ.ศ. 2508 [ 2 ]นำเสนอรูปแบบจุดลอยตัวสองแบบ ได้แก่ รูปแบบ "ความแม่นยำมาตรฐาน" 32 บิต และรูปแบบ "ความแม่นยำขยาย" 40 บิต รูปแบบความแม่นยำมาตรฐานประกอบด้วยส่วนสำคัญแบบสองคอมพลีเมนต์ 24 บิต ในขณะที่รูปแบบความแม่นยำขยายใช้ส่วนสำคัญแบบสองคอมพลีเมนต์ 32 บิต รูปแบบหลังนี้ใช้ประโยชน์จากการดำเนินการจำนวนเต็ม 32 บิตของ CPU อย่างเต็มที่ คุณลักษณะในทั้งสองรูปแบบคือฟิลด์ 8 บิตที่ประกอบด้วยกำลังของสองที่ไบแอสด้วย 128 การดำเนินการทางคณิตศาสตร์จุดลอยตัวดำเนินการโดยซอฟต์แวร์ และไม่รองรับความแม่นยำสอง เท่าเลย รูปแบบขยายใช้คำ 16 บิตสามคำ โดยพื้นที่ส่วนเกินจะถูกละเลย [ 3 ]

ระบบIBM System/360รองรับรูปแบบจุดลอยตัวแบบ "สั้น" 32 บิต และรูปแบบจุดลอยตัวแบบ "ยาว" 64 บิต[ 4 ] ระบบ 360/85 และ System/370รุ่นต่อมาได้เพิ่มการรองรับรูปแบบ "ขยาย" 128 บิต[ 5 ]รูปแบบเหล่านี้ยังคงได้รับการสนับสนุนในการออกแบบ ปัจจุบัน ซึ่งปัจจุบันเรียกว่ารูปแบบ " จุดลอยตัวเลขฐานสิบหก " (HFP)

รูปแบบความแม่นยำสูงของ Microsoft MBF

โปรแกรมMicrosoft BASICสำหรับ ซีพียู 6502เช่นในเวอร์ชันดัดแปลงอย่างCommodore BASIC , AppleSoft BASIC , KIM-1 BASICหรือMicroTAN BASICรองรับ รูป แบบจุดลอยตัว40 บิตแบบขยาย ของ Microsoft Binary Format (MBF) ตั้งแต่ปี 1977 [ 6 ]

รูปแบบความแม่นยำสูง IEEE 754

มาตรฐาน จุดลอยตัว IEEE 754แนะนำให้การใช้งานจัดเตรียมรูปแบบความแม่นยำที่ขยายออกไป มาตรฐานระบุข้อกำหนดขั้นต่ำสำหรับรูปแบบที่ขยายออกไป แต่ไม่ได้ระบุการเข้ารหัส[ 7 ]การเข้ารหัสเป็นทางเลือกของผู้ใช้งาน[ 8 ]

โปรเซสเซอร์ IA32 , x86-64และItaniumรองรับรูปแบบที่มีอิทธิพลมากที่สุดในมาตรฐานนี้ นั่นคือรูปแบบ "double extended" 80 บิตของ Intel (significand 64 บิต) ซึ่งจะอธิบายในส่วนถัด ไป

ตัวประมวลผลร่วมทางคณิตศาสตร์ Motorola 6888xและ ตัวประมวลผล Motorola 68040และ68060ยังรองรับรูปแบบความแม่นยำสูงแบบขยาย 64 บิต (คล้ายกับรูปแบบของ Intel แม้ว่าจะมีการเติมช่องว่างให้เป็นรูปแบบ 96 บิตโดยมีการแทรกบิตที่ไม่ได้ใช้ 16 บิตระหว่างฟิลด์เลขชี้กำลังและฟิลด์ตัวเลขสำคัญ และค่าที่มีเลขชี้กำลังเป็นศูนย์และบิตที่ 63 เป็นหนึ่งถือเป็นค่าปกติ[ 9 ] ) ตัวประมวลผล Coldfireรุ่นต่อมาไม่รองรับรูปแบบความแม่นยำสูงแบบขยาย 96 บิตนี้[ 10 ]

ตัวประมวลผลร่วมทางคณิตศาสตร์ FPA10 สำหรับ โปรเซสเซอร์ ARM รุ่นแรกๆ ยังรองรับรูปแบบความแม่นยำสูงแบบขยาย 64 บิต (คล้ายกับรูปแบบของ Intel แม้ว่าจะมีการเติมให้เป็นรูปแบบ 96 บิตโดยมีการแทรกบิตศูนย์ 16 บิตระหว่างฟิลด์เครื่องหมายและฟิลด์เลขชี้กำลัง) แต่ไม่มีการปัดเศษที่ถูกต้อง[ 11 ]

รูปแบบ x87 และ Motorola 68881 80 บิตตรงตามข้อกำหนดของรูปแบบขยายสองเท่า IEEE 754-1985 [ 12 ] เช่นเดียวกับ รูปแบบไบนารี 128 บิต IEEE 754

รูปแบบความแม่นยำสูง x86

รูปแบบ x86 extended-precision เป็นรูปแบบ 80 บิตที่ถูกนำมาใช้ครั้งแรกในหน่วยประมวลผลร่วมทางคณิตศาสตร์Intel 8087และได้รับการสนับสนุนโดยโปรเซสเซอร์ทั้งหมดที่ใช้สถาปัตยกรรม x86ซึ่งมีหน่วยประมวลผลจุดลอยตัว (FPU)

Intel 8087 เป็น อุปกรณ์ x86 ตัวแรก ที่รองรับการคำนวณเลขทศนิยมในฮาร์ดแวร์ มันถูกออกแบบมาเพื่อรองรับรูปแบบ "ความแม่นยำเดี่ยว" 32 บิต และรูปแบบ "ความแม่นยำคู่" 64 บิต สำหรับการเข้ารหัสและการแลกเปลี่ยนเลขทศนิยม รูปแบบที่ขยายออกไปนี้ไม่ได้ถูกออกแบบมาเพื่อจัดเก็บข้อมูลที่มีความแม่นยำสูงขึ้น แต่เพื่อช่วยให้การคำนวณผลลัพธ์แบบ double ชั่วคราวมีความน่าเชื่อถือและแม่นยำยิ่งขึ้น โดยลดข้อผิดพลาดจากการล้นและการปัดเศษในการคำนวณขั้นกลาง[ a ] ​​[ 14 ] [ 15 ]รีจิสเตอร์เลขทศนิยมทั้งหมดใน 8087 ใช้รูปแบบนี้ และมันจะแปลงตัวเลขเป็นรูปแบบนี้โดยอัตโนมัติเมื่อโหลดรีจิสเตอร์จากหน่วยความจำและยังแปลงผลลัพธ์กลับไปเป็นรูปแบบทั่วไปมากขึ้นเมื่อจัดเก็บรีจิสเตอร์กลับเข้าไปในหน่วยความจำ เพื่อให้สามารถบันทึกผลลัพธ์ของนิพจน์ย่อยระดับกลางลงในตัวแปรชั่วคราวที่มีความแม่นยำสูง และดำเนินการต่อในคำสั่งภาษาการเขียนโปรแกรม และการคำนวณที่ถูกขัดจังหวะสามารถดำเนินการต่อจากจุดที่ถูกขัดจังหวะได้ จึงมีคำสั่งที่ถ่ายโอนค่าระหว่างรีจิสเตอร์ภายในและหน่วยความจำโดยไม่ต้องทำการแปลงใดๆ ซึ่งทำให้สามารถเข้าถึงรูปแบบที่ขยายสำหรับการคำนวณได้[ b ] – ซึ่งยังเป็นการฟื้นประเด็นเรื่องความแม่นยำของฟังก์ชันของตัวเลขดังกล่าว แต่มีความแม่นยำสูงกว่า

หน่วยประมวลผลจุดลอยตัว (FPU) บน โปรเซสเซอร์ x86 รุ่นต่อๆ มาทั้งหมด รองรับรูปแบบนี้ ส่งผลให้สามารถพัฒนาซอฟต์แวร์ที่ใช้ประโยชน์จากความแม่นยำที่สูงขึ้นซึ่งรูปแบบนี้มอบให้ได้William Kahanผู้ออกแบบหลักของ เลขคณิต x87และข้อเสนอมาตรฐาน IEEE 754 เบื้องต้น ได้กล่าวถึงการพัฒนาจุดลอยตัวของ x87 ว่า: "รูปแบบขยายที่กว้างที่สุดเท่าที่เรากล้า (80 บิต) ถูกรวมไว้เพื่อทำหน้าที่สนับสนุนเช่นเดียวกับรูปแบบภายในทศนิยม 13 บิตที่ใช้ในเครื่องคิดเลขทศนิยม 10 บิตของ Hewlett-Packard" [ 17 ] ยิ่งไปกว่านั้น Kahan ยังตั้งข้อสังเกตว่า 64 บิตเป็นตัวเลขสำคัญที่กว้างที่สุดที่สามารถทำการส่งต่อตัวทดได้โดยไม่ต้องเพิ่มเวลาวงจรบน 8087 [ 18 ]และความแม่นยำที่ขยายของ x87 ได้รับการออกแบบให้สามารถขยายไปสู่ความแม่นยำที่สูงขึ้นในโปรเซสเซอร์ในอนาคต:

"ในขณะนี้รูปแบบขยาย 10 ไบต์ถือเป็นการประนีประนอมที่ยอมรับได้ระหว่างคุณค่าของการคำนวณที่แม่นยำเป็นพิเศษและราคาของการใช้งานเพื่อให้ทำงานได้อย่างรวดเร็ว ในไม่ช้าความแม่นยำที่เพิ่มขึ้นอีกสองไบต์จะกลายเป็นสิ่งที่ยอมรับได้ และในที่สุดรูปแบบ 16 ไบต์ ... วิวัฒนาการแบบค่อยเป็นค่อยไปเช่นนี้ไปสู่ความแม่นยำที่กว้างขึ้นนั้นอยู่ในขอบเขตที่IEEE Standard 754 สำหรับการคำนวณเลขทศลอยได้กำหนดไว้แล้ว" [ 19 ]

รูปแบบ 80 บิตนี้ใช้หนึ่งบิตสำหรับเครื่องหมายของตัวเลขสำคัญ 15 บิตสำหรับฟิลด์เลขชี้กำลัง (กล่าวคือ ช่วงเดียวกับรูปแบบ IEEE 754 ความแม่นยำสี่เท่า 128 บิต ) และ 64 บิตสำหรับตัวเลขสำคัญ ฟิลด์เลขชี้กำลังมีค่าไบแอส 16383 ซึ่งหมายความว่าต้องลบ 16383 ออกจากค่าในฟิลด์เลขชี้กำลังเพื่อคำนวณกำลังที่แท้จริงของ2 [ 20 ]ค่าฟิลด์เลขชี้กำลัง 32767 (บิตทั้งหมด 15 บิต)ถูกสงวนไว้เพื่อให้สามารถแสดงสถานะพิเศษ เช่นอนันต์และไม่ใช่ตัวเลขหากฟิลด์เลขชี้กำลังเป็นศูนย์ ค่าจะเป็นตัวเลขย่อยปกติและเลขชี้กำลังของ 2 คือ −16382 [ 21 ]

ในตารางต่อไปนี้ " s " คือค่าของบิตเครื่องหมาย (0 หมายถึงบวก 1 หมายถึงลบ) " e " คือค่าของฟิลด์เลขชี้กำลังที่ตีความว่าเป็นจำนวนเต็มบวก และ " m " คือค่าสำคัญที่ตีความว่าเป็นเลขฐานสองบวก โดยจุดทศนิยมอยู่ที่ระหว่างบิตที่ 63 และ 62 ฟิลด์ " m " คือการรวมกันของส่วนจำนวนเต็มและส่วนทศนิยมในแผนภาพด้านบน

การตีความฟิลด์ของค่า x86 Extended-Precision
เลขชี้กำลัง สำคัญ ความหมาย
บิต78–64บิต63บิต62–0
ทั้งหมด000ศูนย์ บิตเครื่องหมายจะให้เครื่องหมายของศูนย์ ซึ่งโดยปกติแล้วไม่มีความหมาย
ไม่เป็นศูนย์ต่ำกว่าปกติ ค่าคือ(−1) s × m × 2 −16382 
1อะไรก็ตามค่า Pseudo Subnormal รุ่น 80387 และรุ่นที่ใหม่กว่าจะตีความค่านี้ได้อย่างถูกต้อง แต่จะไม่สร้างค่านี้ขึ้นมา ค่าที่ได้คือ(−1) s × m × 2 −16382 
ทั้งหมด100ค่าอนันต์เทียม บิตเครื่องหมายจะให้เครื่องหมายของค่าอนันต์ โปรเซสเซอร์ 8087 และ 80287 จะถือว่านี่คือค่าอนันต์ ในขณะที่โปรเซสเซอร์ 80387 และรุ่นที่ใหม่กว่าจะถือว่านี่คือตัวดำเนินการที่ไม่ถูกต้อง
ไม่เป็นศูนย์ข้อความนี้แสดงเป็น 'ไม่ใช่ตัวเลข' (Pseudo 'Not a Number') บิตเครื่องหมายไม่มีความหมาย โปรเซสเซอร์ 8087 และ 80287 จะถือว่านี่เป็นสัญญาณไม่ใช่ตัวเลข (Signaling Not a Number) ส่วนโปรเซสเซอร์ 80387 และรุ่นที่ใหม่กว่าจะถือว่านี่เป็นตัวดำเนินการที่ไม่ถูกต้อง (invalid operand)
10อนันต์ บิตเครื่องหมายจะให้เครื่องหมายของอนันต์ ไมโครคอนโทรลเลอร์ 8087 และ 80287 จะถือว่าค่าเหล่านี้เป็นสัญญาณ "ไม่ใช่ตัวเลข"
ไม่เป็นศูนย์ไม่ใช่ตัวเลข บิตเครื่องหมายไม่มีความหมาย ชิป 8087 และ 80287 จะถือว่าทั้งหมดนี้เป็นสัญญาณ "ไม่ใช่ตัวเลข"

บิตที่ 62 บ่งชี้ถึงค่า Quiet Not a Number หากบิตอื่นๆ เป็นศูนย์ทั้งหมด ค่านี้จะเป็นค่า Floating-Point Indefinite ซึ่งเป็นผลมาจากการคำนวณที่ไม่ถูกต้อง เช่น การหาค่ารากที่สองของจำนวนลบ การหาค่าลอการิทึมของจำนวนลบ การคูณ 0 กับ 0 การคูณ ∞ กับ ∞ การคูณ ∞ กับ 0 และอื่นๆ เมื่อโปรเซสเซอร์ถูกตั้งค่าไม่ให้สร้างข้อยกเว้นสำหรับตัวดำเนินการที่ไม่ถูกต้อง

อื่นๆ 0อะไรก็ตามผิดปกติ สร้างขึ้นเฉพาะบน 8087 และ 80287 เท่านั้น 80387 และรุ่นที่ใหม่กว่าจะถือว่านี่เป็นตัวดำเนินการที่ไม่ถูกต้อง ค่าคือ(−1) s × m × 2 e − 16383 
1อะไรก็ตามค่าปกติ ค่าคือ(−1) s × m × 2 e − 16383 

แตกต่างจาก รูปแบบความแม่นยำ เดี่ยวและความแม่นยำคู่รูปแบบนี้ไม่ได้ใช้บิตแฝง/ซ่อนเร้นแต่บิตที่ 63 จะเก็บส่วนจำนวนเต็มของตัวเลขสำคัญ และบิตที่ 62-60 จะเก็บส่วนทศนิยม บิตที่ 63 จะมีค่าเป็น 1 ในทุกตัวเลขที่ถูกทำให้เป็นมาตรฐาน การออกแบบนี้มีข้อดีหลายประการในระหว่างการพัฒนา 8087 :

  • การคำนวณจะเสร็จเร็วขึ้นเล็กน้อยหากบิตทั้งหมดของตัวเลขสำคัญ (significand) ปรากฏอยู่ในรีจิสเตอร์
  • ค่าสำคัญขนาด 64 บิตให้ความแม่นยำเพียงพอที่จะหลีกเลี่ยงการสูญเสียความแม่นยำเมื่อแปลงผลลัพธ์กลับไปเป็นรูปแบบความแม่นยำสองเท่าในกรณีส่วนใหญ่
  • รูปแบบนี้มีกลไกในการระบุการสูญเสียความแม่นยำเนื่องจากค่าต่ำกว่าขีดจำกัด ซึ่งสามารถนำไปใช้ในการคำนวณเพิ่มเติมได้ ตัวอย่างเช่น การคำนวณ2 × 10 −4930 × 3 × 10 −10 × 4 × 1020สร้างผลลัพธ์ระดับกลาง6 × 10 −4940ซึ่งเป็นค่าต่ำกว่าปกติและยังเกี่ยวข้องกับการสูญเสียความแม่นยำด้วย ผลคูณของทุกเทอมคือ24 × 10 −4920ซึ่งสามารถแสดงเป็นตัวเลขปกติได้ โปรเซสเซอร์80287สามารถคำนวณนี้ให้เสร็จสมบูรณ์และระบุการสูญเสียความแม่นยำโดยการส่งคืนผลลัพธ์ "ต่ำกว่าปกติ" (เลขชี้กำลังไม่ใช่ 0 บิต 63 = 0) [ 22 ] [ 23 ] โปรเซสเซอร์ตั้งแต่80387ไม่สร้างค่าที่ไม่ปกติอีกต่อไปและไม่รองรับอินพุตที่ไม่ปกติสำหรับการดำเนินการ พวกมันจะสร้างค่าต่ำกว่าปกติหากเกิดการอันเดอร์โฟลว์ แต่จะสร้างผลลัพธ์ปกติหากการดำเนินการในภายหลังบนค่าต่ำกว่าปกติสามารถทำให้เป็นปกติได้ [ 24 ]

ตัวอย่าง

ตัวอย่างเหล่านี้แสดงค่าทศนิยม ในรูปแบบบิต ใน ระบบเลขฐานสิบ หกซึ่งรวมถึงเครื่องหมาย เลขชี้กำลัง (ที่ปรับค่าแล้ว) และตัวเลขสำคัญ

0000 0000 0000 0000 0001 16 = 2 −16382 × 2 −63 = 2 −16445 ≈ 3.64519953188247460252841 × 10 −4951 (จำนวนย่อยปกติที่เป็นบวกที่น้อยที่สุด) 
0000 7fff ffff ffff ffff 16 = 2 −16382 × (1 − 2 −63 ) ≈ 3.36210314311209350589816 × 10 −4932 (จำนวนต่ำกว่าปกติที่มากที่สุด) 
0001 8000 0000 0000 0000 16 = 2 −16382 ≈ 3.36210314311209350626268 × 10 −4932 (จำนวนปกติบวกที่น้อยที่สุด) 
7ffe ffff ffff ffff ffff 16 = 2 16384 × (1 − 2 −64 ) ≈ 1.18973149535723176502126 × 10 4932 (จำนวนปกติที่มากที่สุด) 
3ffe ffff ffff ffff ffff 16 = 1 − 2 −64 ≈ 0.9999999999999999994579 (จำนวนมากที่สุดที่น้อยกว่าหนึ่ง) 
3fff 8000 0000 0000 0000 16 = 1 (หนึ่ง) 
3fff 8000 0000 0000 0001 16 = 1 + 2 −63 ≈ 1.00000000000000000010842 (จำนวนน้อยที่สุดที่มากกว่าหนึ่ง) 
4000 8000 0000 0000 0000 16 = 2 c000 8000 0000 0000 0000 16 = −2 
0000 0000 0000 0000 0000 16 = 0 8000 0000 0000 0000 0000 16 = −0 
3ffd อ๊าาา อ๊า อ๊า อ๊า อ๊า อ๊า16 data 0.3333333333333333334237 (ค่าประมาณที่ใกล้เคียงที่สุดกับ ⅓) 
4000 adf8 5458 a2bb 4a9b 16 data 2.71828182845904523542817 (ค่าประมาณที่ใกล้เคียงที่สุดกับ e) 
4000 c90f daa2 2168 c235 16 data 3.14159265358979323851281 (ค่าประมาณที่ใกล้เคียงที่สุดกับ π) 

คำแนะนำการใช้งาน

รูปแบบจุดลอยตัว 80 บิตมีให้ใช้กันอย่างแพร่หลายในปี 1984 [ 25 ]หลังจากการพัฒนาภาษาคอมพิวเตอร์ C, Fortran และภาษาที่คล้ายกัน ซึ่งในตอนแรกมีเพียงขนาดจุดลอยตัว 32 และ 64 บิตทั่วไปเท่านั้น บนสถาปัตยกรรม x86 คอมไพเลอร์ Cส่วนใหญ่ในปัจจุบันรองรับความแม่นยำแบบขยาย 80 บิตผ่านทาง ชนิดข้อมูล long doubleและสิ่งนี้ได้รับการระบุไว้ใน มาตรฐาน C99 / C11 (IEC 60559 การคำนวณเลขจุดลอยตัว (ภาคผนวก F)) คอมไพเลอร์บน x86 สำหรับภาษาอื่นๆ มักจะรองรับความแม่นยำแบบขยายเช่นกัน บางครั้งผ่านส่วนขยายที่ไม่เป็นมาตรฐาน ตัวอย่างเช่นTurbo Pascalมีextendedชนิดข้อมูล และ คอมไพเลอร์ Fortran หลายตัว มีREAL*10ชนิดข้อมูล (คล้ายกับREAL*4และREAL*8) คอมไพเลอร์ดังกล่าวโดยทั่วไปยังรวมถึงรูทีนย่อย ทางคณิตศาสตร์ที่มีความแม่นยำแบบขยาย เช่นรากที่สองและฟังก์ชันตรีโกณมิติในไลบรารี มาตรฐานของพวกเขา ด้วย

ช่วงการทำงาน

รูปแบบเลขทศลอย 80 บิตมีช่วง (รวมถึงค่าต่ำกว่าปกติ ) ตั้งแต่ประมาณ3.65 × 10 −4951ถึง1.18 × 10+4932ถึงแม้ว่า log 10 ( 2 64 ) ≈ 19.266แต่รูปแบบนี้มักจะอธิบายว่าให้ความแม่นยำประมาณสิบแปดหลักสำคัญ (ค่าปัดเศษลงของ log 10 ( 2 63 )ซึ่งเป็นความแม่นยำขั้นต่ำที่รับประกัน) การใช้เลขฐานสิบเมื่อพูดถึงเลขฐานสองนั้นไม่เหมาะสม เพราะเศษส่วนทศนิยมส่วนใหญ่เป็นลำดับที่เกิดซ้ำในเลขฐานสอง เช่นเดียวกับ ⅔ ในเลขฐานสิบ ดังนั้น ค่าเช่น 10.15 จะถูกแสดงในเลขฐานสองเป็นค่าเทียบเท่ากับ 10.1499996185 เป็นต้น ในเลขฐานสิบREAL*4แต่ 10.15000000000000035527 เป็นต้น ในREAL*8เลขฐานสอง การแปลงระหว่างกันจะเกี่ยวข้องกับการประมาณค่า ยกเว้นเศษส่วนทศนิยมบางส่วนที่แสดงค่าเลขฐานสองที่แน่นอน เช่น 0.625 สำหรับREAL*10ค่า สตริงทศนิยมคือ 10.149999999999999996530553 เป็นต้น ตัวเลข 9 หลักสุดท้ายเป็นหลักทศนิยมลำดับที่สิบแปด และเป็นหลักนัยลำดับที่ยี่สิบของสตริง ขอบเขตของการแปลงระหว่างทศนิยมและไบนารีสำหรับรูปแบบ 80 บิตสามารถกำหนดได้ดังนี้: หากสตริงทศนิยมที่มีหลักนัยไม่เกิน 18 หลักถูกปัดเศษอย่างถูกต้องเป็นค่าไบนารีแบบลอยตัว 80 บิต IEEE 754 (เช่นเดียวกับอินพุต) แล้วแปลงกลับเป็นจำนวนหลักทศนิยมที่มีหลักนัยเท่าเดิม (เช่นเดียวกับเอาต์พุต) สตริงสุดท้ายจะตรงกับต้นฉบับอย่างแน่นอน ในทางกลับกัน หากค่าไบนารีแบบลอยตัว 80 บิต IEEE 754 ถูกแปลงอย่างถูกต้องและปัดเศษ (ใกล้เคียงที่สุด) เป็นสตริงทศนิยมที่มีหลักทศนิยมที่มีหลักนัยอย่างน้อย 21 หลัก แล้วแปลงกลับเป็นรูปแบบไบนารี มันจะตรงกับต้นฉบับอย่างแน่นอน [ 12 ]การประมาณค่าเหล่านี้เป็นปัญหาอย่างยิ่งเมื่อระบุค่าที่ดีที่สุดสำหรับค่าคงที่ในสูตรด้วยความแม่นยำสูง ซึ่งอาจคำนวณได้ผ่านเลขคณิต ความแม่นยำตามอำเภอใจ

จำเป็นต้องใช้รูปแบบ 80 บิต

ตัวอย่างที่โดดเด่นของความจำเป็นในการใช้ความแม่นยำอย่างน้อย 64 บิตในส่วนสำคัญของรูปแบบความแม่นยำแบบขยายคือความจำเป็นในการหลีกเลี่ยงการสูญเสียความแม่นยำเมื่อทำการยกกำลังบนค่าความแม่นยำสองเท่า[ 26 ] [ 27 ] [ 28 ] [ c ]หน่วย ประมวลผลจุดลอยตัว x86ไม่มีคำสั่งที่ทำการยกกำลัง โดยตรง แต่มีชุดคำสั่งที่โปรแกรมสามารถใช้ตามลำดับเพื่อทำการยกกำลังโดยใช้สมการ:

เพื่อหลีกเลี่ยงการสูญเสียความแม่นยำ ผลลัพธ์ระดับกลาง " log 2 ( x ) " และ " y ·log 2 ( x ) " จะต้องถูกคำนวณด้วยความแม่นยำสูงกว่ามาก เนื่องจากในทางปฏิบัติแล้วทั้งฟิลด์เลขชี้กำลังและฟิลด์ตัวเลขสำคัญของxจะต้องพอดีกับฟิลด์ตัวเลขสำคัญของผลลัพธ์ระดับกลาง จากนั้น ฟิลด์ตัวเลขสำคัญของผลลัพธ์ระดับกลางจะถูกแบ่งระหว่างฟิลด์เลขชี้กำลังและฟิลด์ตัวเลขสำคัญของผลลัพธ์สุดท้ายเมื่อ คำนวณ ผลลัพธ์ระดับกลาง2 ครั้งการอธิบายต่อไปนี้จะอธิบายข้อกำหนดนี้โดยละเอียดมากขึ้น

หากอธิบายอย่างละเอียด ค่า ความแม่นยำสองเท่า ตามมาตรฐาน IEEE 754 สามารถแสดงได้ดังนี้:

โดยที่sคือเครื่องหมายของเลขชี้กำลัง (0 หรือ 1) Eคือเลขชี้กำลังที่ไม่เอนเอียง ซึ่งเป็นจำนวนเต็มที่มีค่าตั้งแต่ 0 ถึง 1023 และMคือค่าสำคัญ ซึ่งเป็นค่า 53 บิตที่อยู่ในช่วง1 ≤ M < 2จำนวนลบและศูนย์สามารถละเว้นได้เนื่องจากลอการิทึมของค่าเหล่านี้หาค่าไม่ได้ สำหรับการอธิบายในที่นี้Mไม่มีความแม่นยำ 53 บิตเพราะถูกจำกัดให้มากกว่าหรือเท่ากับหนึ่ง กล่าวคือ บิตที่ซ่อนอยู่จะไม่นับรวมในความแม่นยำ (โปรดทราบว่าในกรณีที่Mน้อยกว่า 1 ค่าที่ได้จะเป็นค่าผิดปกติและอาจสูญเสียความแม่นยำไปแล้ว สถานการณ์นี้อยู่นอกเหนือขอบเขตของบทความนี้)

เมื่อนำค่าลอการิทึมของ ตัวเลข ทศนิยมสองเท่า นี้มาใช้ และทำการลดรูปจะได้ผลลัพธ์ดังต่อไปนี้:

ผลลัพธ์นี้แสดงให้เห็นว่า เมื่อหาค่าลอการิทึมฐาน 2 ของจำนวนใดๆ เครื่องหมายของเลขชี้กำลังของค่าเดิมจะกลายเป็นเครื่องหมายของลอการิทึม เลขชี้กำลังของค่าเดิมจะกลายเป็นส่วนจำนวนเต็มของตัวเลขสำคัญของลอการิทึม และตัวเลขสำคัญของค่าเดิมจะถูกแปลงเป็นส่วนทศนิยมของตัวเลขสำคัญของลอการิทึม

เนื่องจากEเป็นจำนวนเต็มในช่วง 0 ถึง 1023 จึงต้องใช้บิตทางซ้ายของจุดทศนิยมมากถึง 10 บิตเพื่อแสดงส่วนที่เป็นจำนวนเต็มของลอการิทึม เนื่องจากMอยู่ในช่วง1 ≤ M < 2ดังนั้นค่าของlog 2 Mจะอยู่ในช่วง0 ≤ log 2 M < 1จึงต้องใช้บิตทางขวาของจุดทศนิยมอย่างน้อย 52 บิตเพื่อแสดงส่วนที่เป็นทศนิยมของลอการิทึม การรวม 10 บิตทางซ้ายของจุดทศนิยมกับ 52 บิตทางขวาของจุดทศนิยมหมายความว่าส่วนสำคัญของลอการิทึมจะต้องคำนวณด้วยความแม่นยำอย่างน้อย 62 บิต ในทางปฏิบัติ ค่าMที่น้อยกว่า 1023 จะต้องใช้ 53 บิตทางขวาของจุดทศนิยม และค่าMที่น้อยกว่า1023 จะต้องใช้ 54 บิตทางขวาของจุดทศนิยมเพื่อหลีกเลี่ยงการสูญเสียความแม่นยำ เพื่อให้เกิดความสมดุลกับความต้องการความแม่นยำที่เพิ่มขึ้นทางด้านขวาของจุดทศนิยม เลขชี้กำลังที่น้อยกว่า 512 จึงต้องการเพียง 9 บิตทางด้านซ้ายของจุดทศนิยม และเลขชี้กำลังที่น้อยกว่า 256 ต้องการเพียง 8 บิตทางด้านซ้ายของจุดทศนิยม

ส่วนสุดท้ายของ การคำนวณ เลขยกกำลังคือการคำนวณผลลัพธ์ขั้นกลาง2 ค่า ผลลัพธ์ขั้นกลาง นี้ประกอบด้วยส่วนจำนวนเต็ม " I " บวกกับส่วนทศนิยม " F " หากผลลัพธ์ขั้นกลางเป็นค่าลบ จะต้องปรับค่าเล็กน้อยเพื่อให้ได้ส่วนทศนิยมที่เป็นบวก เนื่องจากทั้ง " I " และ " F " เป็นจำนวนลบ

สำหรับผลลัพธ์ระยะกลางที่เป็นบวก:

สำหรับผลลัพธ์ระหว่างกาลที่เป็นลบ:

ดังนั้น ส่วนจำนวนเต็มของผลลัพธ์ขั้นกลาง (" I " หรือ" I − 1 ")บวกกับค่าไบแอส จะกลายเป็นเลขชี้กำลังของผลลัพธ์สุดท้าย และส่วนทศนิยมบวกที่แปลงแล้วของผลลัพธ์ขั้นกลาง: 2Fหรือ2F + 1 จะกลายเป็นส่วนสำคัญของผลลัพธ์สุดท้าย เพื่อให้ได้ความแม่นยำ 52 บิตสำหรับผลลัพธ์ สุดท้าย ส่วนทศนิยมบวกจะต้องมี ขนาดอย่างน้อย 52 บิต

โดยสรุปแล้ว จำนวนบิตความแม่นยำที่แน่นอนที่จำเป็นในส่วนสำคัญของผลลัพธ์ขั้นกลางนั้นขึ้นอยู่กับข้อมูล แต่ 64 บิตก็เพียงพอที่จะหลีกเลี่ยงการสูญเสียความแม่นยำใน การคำนวณเลข ยกกำลัง ส่วนใหญ่ ที่เกี่ยวข้องกับตัวเลข ความแม่นยำสองเท่า

จำนวนบิตที่จำเป็นสำหรับเลขชี้กำลังของรูปแบบความแม่นยำแบบขยายนั้น มาจากข้อกำหนดที่ว่า ผลคูณของ ตัวเลข ความแม่นยำ สองเท่าสอง จำนวน จะต้องไม่เกินค่าที่กำหนดเมื่อคำนวณโดยใช้รูปแบบขยาย เลขชี้กำลังที่มากที่สุดที่เป็นไปได้ของ ค่า ความแม่นยำสองเท่าคือ 1023 ดังนั้น เลขชี้กำลังของผลคูณที่มากที่สุดที่เป็นไปได้ของตัวเลขความแม่นยำสองเท่า สอง จำนวน คือ 2047 (ค่า 11 บิต) การเพิ่มค่าไบแอสเพื่อรองรับเลขชี้กำลังติดลบ หมายความว่า ฟิลด์เลขชี้กำลังจะต้องมีความกว้างอย่างน้อย 12 บิต

เมื่อรวมข้อกำหนดเหล่านี้เข้าด้วยกัน: 1 บิตสำหรับเครื่องหมาย, 12 บิตสำหรับเลขชี้กำลังแบบไบแอส และ 64 บิตสำหรับตัวเลขสำคัญ หมายความว่ารูปแบบความแม่นยำแบบขยายจะต้องใช้อย่างน้อย 77 บิต การพิจารณาทางวิศวกรรมส่งผลให้มีการกำหนดรูปแบบ 80 บิตในขั้นสุดท้าย (โดยเฉพาะอย่างยิ่งมาตรฐาน IEEE 754 กำหนดให้ช่วงเลขชี้กำลังของรูปแบบความแม่นยำแบบขยายต้องตรงกับ รูปแบบความแม่นยำแบบ ควอด ที่ใหญ่ที่สุดถัดไป ซึ่งมี 15 บิต) [ 27 ]

อีกตัวอย่างหนึ่งของการคำนวณที่ได้รับประโยชน์จากเลขคณิตความแม่นยำสูงคือ แผนการ ปรับปรุงแบบวนซ้ำซึ่งใช้เพื่อขจัดข้อผิดพลาดที่สะสมในวิธีแก้ปัญหาโดยตรงโดยอ้อมในระหว่างการคำนวณจำนวนมากที่ทำขึ้นสำหรับพีชคณิตเชิงเส้นเชิงตัวเลข[ 30 ]

การสนับสนุนด้านภาษา

  • การใช้งาน C / C++บางส่วน(เช่นGNU Compiler Collection (GCC), Clang , Intel C++ ) long doubleใช้ตัวเลขจุดลอยตัว 80 บิตบนระบบ x86 อย่างไรก็ตาม นี่เป็นพฤติกรรมที่กำหนดโดยการใช้งานและไม่ใช่ข้อกำหนด แต่ได้รับอนุญาตตามมาตรฐาน ตามที่ระบุไว้สำหรับฮาร์ดแวร์ IEEE 754 ใน มาตรฐาน C99 "ภาคผนวก F IEC 60559 การคำนวณเลขจุดลอยตัว" GCC ยังจัดเตรียม__float80และ__float128ประเภทต่างๆ ด้วย [ 31 ]
  • บาง โปรแกรมที่ใช้ Common Lisp (เช่นCMU Common Lisp , Embeddable Common Lisp ) long-floatใช้ตัวเลขทศลอย 80 บิตในการประมวลผลบนระบบ x86
  • ภาษาโปรแกรมDrealใช้ขนาดเลขทศนิยมที่ใหญ่ที่สุดเท่าที่ฮาร์ดแวร์จะรองรับได้ เช่น 80 บิตสำหรับ ซีพียู x86สำหรับเครื่องอื่นๆ จะใช้ขนาดเลขทศนิยมที่กว้างที่สุดที่ซีพียูรองรับ หรือเลขทศนิยมสองเท่า 64 บิต แล้วแต่ว่าขนาดใดกว้างกว่ากัน
  • Turbo Pascal (และObject PascalหรือDelphi ) มีextendedชนิดข้อมูล 80 บิต นอกเหนือจากreal/ single(32 บิต) และdouble(64 บิต) ทั้งแบบเนทีฟ (เมื่อมีโคโปรเซสเซอร์ 80x87 อยู่) หรือแบบจำลอง (ผ่านไลบรารี Turbo87) extendedชนิดข้อมูลนี้สามารถใช้งานได้บนแพลตฟอร์ม 16 บิต 32 บิต และ 64 บิต โดยอาจมีการเติมช่องว่าง[ 32 ]
  • ระบบรันไทม์ Racket รองรับชนิดข้อมูล extflonum ขนาด 80 บิตบนระบบx86
  • ไลบรารีมาตรฐานของ SwiftFloat80 มี ชนิดข้อมูลนี้ให้ใช้งาน
  • คอมไพเลอร์ PowerBASIC BASICมีชนิดข้อมูลจุดลอยตัวความแม่นยำสูงขนาด 10 EXTไบต์EXTENDED
  • BBC BASICบางเวอร์ชันโดยเฉพาะBBC BASIC สำหรับ WindowsและBBC BASIC สำหรับ SDL 2.0รองรับตัวเลขทศลอยความแม่นยำสูง 10 ไบต์ เมื่อทำงานบนซีพียู x86
  • Zigมีประเภท f80 ให้ใช้งานตั้งแต่เวอร์ชัน 0.10.0 เป็นต้นไป

ดูเพิ่มเติม

เชิงอรรถ

  1. ^ "รูปแบบนี้มีจุดประสงค์หลักเพื่อช่วยให้โปรแกรมเมอร์ปรับปรุงความสมบูรณ์ของซอฟต์แวร์แบบเดี่ยวและแบบคู่ และลดการเสื่อมสภาพจากการปัดเศษในการคำนวณเมทริกซ์คู่ที่มีมิติขนาดใหญ่ขึ้น และสามารถใช้ได้อย่างง่ายดายในลักษณะที่การแทนที่แบบควอดรูเพิลด้วยแบบขยายไม่จำเป็นต้องทำให้การใช้งานเป็นโมฆะ" — นักออกแบบx87 W. Kahan [ 13 ]
  2. ^ "ภาษาโปรแกรมระดับสูงจะใช้ extended (โดยมองไม่เห็น) เพื่อประเมินนิพจน์ย่อยระดับกลาง และในภายหลังอาจให้ extended เป็นประเภทข้อมูลที่ประกาศได้" [ 16 ] : 70
  3. ^ "การมีบิตความแม่นยำเพิ่มเติมอย่างน้อยเท่ากับในฟิลด์เลขชี้กำลังของรูปแบบพื้นฐานที่รองรับนั้นช่วยลดความซับซ้อนในการคำนวณฟังก์ชันอดิศัย ผลคูณภายใน และฟังก์ชันกำลัง y x ได้อย่างแม่นยำยิ่งขึ้น " [ 29 ] : 70
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Extended_precision&oldid=1359271849 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ความแม่นยำสูงขึ้น

ความแม่นยำแบบขยาย หมายถึง รูปแบบตัวเลข จุดลอยตัว ที่ให้ ความแม่นยำ มากกว่า รูปแบบตัวเลขจุดลอยตัวพื้นฐาน [ 1 ] รูปแบบความแม่นยำแบบขยายรองรับรูปแบบพื้นฐานโดย...

การใช้งานความแม่นยำสูงพิเศษ

รูปแบบเลขทศนิยมแบบขยายมีประวัติความเป็นมาอันยาวนาน ย้อนกลับไปเกือบถึงกลางศตวรรษที่ 20 ผู้ผลิตหลายรายได้ใช้รูปแบบที่แตกต่างกันสำหรับความแม่นยำสูงขึ้นในเครื่องคอมพิวเตอร์แต่ละเครื่อง ในหลายกรณี...

รูปแบบความแม่นยำสูงของ IBM

IBM 1130 ซึ่งวางจำหน่ายในปี พ.ศ. 2508 [ 2 ] นำเสนอรูปแบบจุดลอยตัวสองแบบ ได้แก่ รูปแบบ "ความแม่นยำมาตรฐาน" 32 บิต และรูปแบบ "ความแม่นยำขยาย" 40 บิต รูปแบบความแม่นยำมาตรฐานประกอบด้วย ส่วนสำคัญ แบบสองคอมพลีเมนต์ 24 บิต...

รูปแบบความแม่นยำสูงของ Microsoft MBF

โปรแกรม Microsoft BASIC สำหรับ ซีพียู 6502 เช่นในเวอร์ชันดัดแปลงอย่าง Commodore BASIC , AppleSoft BASIC , KIM-1 BASIC หรือ MicroTAN BASIC รองรับ รูป แบบจุดลอยตัว 40 บิตแบบขยาย ของ Microsoft Binary Format (MBF) ตั้งแต่ปี 1977 [ 6 ]