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

อ่าน 9 นาที

รูปแบบจุดลอยตัวความแม่นยำเดี่ยว

รูปแบบเลขทศนิยมความแม่นยำเดี่ยว (บางครั้งเรียกว่า FP32 , float32 หรือ float ) เป็น รูปแบบตัวเลขคอมพิวเตอร์ ซึ่งโดยทั่วไปจะใช้พื้นที่ 32 บิต ใน หน่วย ความ จำคอมพิวเตอร์...

รูปแบบจุดลอยตัวความแม่นยำเดี่ยว

รูปแบบเลขทศนิยมความแม่นยำเดี่ยว (บางครั้งเรียกว่าFP32 , float32หรือfloat ) เป็นรูปแบบตัวเลขคอมพิวเตอร์ซึ่งโดยทั่วไปจะใช้พื้นที่32 บิตใน หน่วย ความ จำคอมพิวเตอร์และสามารถแสดงค่าตัวเลขได้หลากหลายโดยใช้จุดทศนิยม

ตัวแปรจุดลอยตัวสามารถแทนค่าตัวเลขได้หลากหลายกว่า ตัวแปร จุดคงที่ที่มีความกว้างบิตเท่ากัน แต่ต้องแลกมาด้วยความแม่นยำที่ ลดลง ตัวแปรจำนวนเต็ม 32 บิตแบบมีเครื่องหมายมีค่าสูงสุดเท่ากับ2³¹ − 1 = 2,147,483,647 ในขณะที่ตัวแปรจุดลอยตัวฐาน 2 32 บิตIEEE 754 มีค่าสูงสุดจำกัดเท่ากับ (2 − 2 −23 ) × 2¹²⁷ ≈ 3.4028235 × 10³⁸จำนวนเต็มทั้งหมดที่มีทศนิยมเจ็ดหลักหรือน้อยกว่า และ 2n ใดๆสำหรับจำนวนเต็ม −149 ≤ n ≤ 127 สามารถแปลงเป็นค่าจุดลอยตัวความแม่นยำเดี่ยว IEEE 754 ได้อย่างแม่นยำ

ใน มาตรฐาน IEEE 754 รูปแบบฐาน 2 ขนาด 32 บิต ถูกเรียกอย่างเป็นทางการว่าbinary32 ; ในมาตรฐานIEEE 754-1985เรียกว่าsingleมาตรฐาน IEEE 754 ยังกำหนดประเภทจุดลอยตัวเพิ่มเติม เช่นความแม่นยำสองเท่า ฐาน 2 ขนาด 64 บิต และล่าสุดคือการแสดงผลฐาน 10

ภาษาโปรแกรม ฟอร์ แทรน (Fortran ) เป็น หนึ่งในภาษาโปรแกรมแรกๆที่รองรับชนิดข้อมูลจุดลอยตัวแบบความแม่นยำเดี่ยวและความแม่นยำคู่ก่อนที่มาตรฐาน IEEE 754-1985 จะถูกนำมาใช้กันอย่างแพร่หลาย การแสดงผลและคุณสมบัติของชนิดข้อมูลจุดลอยตัวนั้นขึ้นอยู่กับผู้ผลิตคอมพิวเตอร์และรุ่นของคอมพิวเตอร์ รวมถึงการตัดสินใจของผู้พัฒนาภาษาโปรแกรม ตัวอย่างเช่นชนิดข้อมูลความแม่นยำเดี่ยวของGW-BASIC คือ รูปแบบจุดลอยตัว MBF 32 บิต

ความแม่นยำเดี่ยวเรียกว่าSINGLE-FLOATในCommon Lisp [ 1 ] float binary(p)โดยที่ p≤21, float decimal(p)โดยที่ค่าสูงสุดของ p ขึ้นอยู่กับว่าแอตทริบิวต์ DFP (IEEE 754 DFP) ใช้ได้หรือไม่ ใน PL/I; floatใน C ที่รองรับ IEEE 754, C++ (ถ้าอยู่ใน C), C#และJava [ 2 ] floatในHaskell [ 3 ]และSwift [ 4 ]และSingleในObject Pascal ( Delphi ), Visual BasicและMATLABอย่างไรก็ตามfloatในPython , Ruby , PHPและOCamlและsingle ใน Octaveเวอร์ชันก่อน 3.2 หมายถึง ตัวเลข ความแม่นยำสองเท่าในการใช้งานPostScript ส่วนใหญ่ และระบบฝังตัว บางระบบ ความแม่นยำที่รองรับเพียงอย่างเดียวคือความแม่นยำ เดี่ยว

มาตรฐาน IEEE 754: binary32

มาตรฐาน IEEE 754 ระบุว่าbinary32มีคุณสมบัติดังนี้:

สิ่งนี้ให้ความแม่นยำ ของตัวเลขทศนิยมที่มีนัยสำคัญตั้งแต่ 6 ถึง 9 หลักหากสตริงทศนิยมที่มีตัวเลขที่มีนัยสำคัญไม่เกิน 6 หลักถูกแปลงเป็นรูปแบบความแม่นยำเดี่ยว IEEE 754 ซึ่งให้ตัวเลขปกติแล้วแปลงกลับเป็นสตริงทศนิยมที่มีจำนวนหลักเท่าเดิม ผลลัพธ์สุดท้ายควรตรงกับสตริงเดิม หากตัวเลขความแม่นยำเดี่ยว IEEE 754 ถูกแปลงเป็นสตริงทศนิยมที่มีตัวเลขที่มีนัยสำคัญอย่างน้อย 9 หลัก แล้วแปลงกลับเป็นรูปแบบความแม่นยำเดี่ยว ผลลัพธ์สุดท้ายต้องตรงกับตัวเลขเดิม[ 5 ]

บิตเครื่องหมายกำหนดเครื่องหมายของตัวเลข ซึ่งเป็นเครื่องหมายของตัวเลขสำคัญด้วย "1" หมายถึงค่าลบ ฟิลด์เลขชี้กำลังเป็นจำนวนเต็ม 8 บิตที่ไม่มีเครื่องหมาย ตั้งแต่ 0 ถึง 255 ในรูปแบบไบแอส : ค่า 127 แทนเลขชี้กำลังศูนย์จริง เลขชี้กำลังมีค่าตั้งแต่ −126 ถึง +127 (ดังนั้น 1 ถึง 254 ในฟิลด์เลขชี้กำลัง) เนื่องจากค่าเลขชี้กำลังไบแอส 0 (เป็น 0 ทั้งหมด) และ 255 (เป็น 1 ทั้งหมด) ถูกสงวนไว้สำหรับตัวเลขพิเศษ ( ตัวเลขย่อยปกติ , ศูนย์ที่มีเครื่องหมาย , อนันต์และNaN )

ส่วนสำคัญของตัวเลขปกติประกอบด้วยบิตเศษส่วน 23 บิตทางด้านขวาของจุดทศนิยม และบิตนำโดยปริยาย (ทางด้านซ้ายของจุดทศนิยม) ที่มีค่าเป็น 1 ส่วนตัวเลขซับนอร์มอลและศูนย์ (ซึ่งเป็นตัวเลขทศนิยมที่มีขนาดเล็กกว่าตัวเลขปกติที่เป็นบวกน้อยที่สุด) จะถูกแทนด้วยค่าเลขชี้กำลังแบบไบแอส 0 ทำให้บิตนำโดยปริยายมีค่าเป็น 0 ดังนั้นจึงมีเพียงบิตเศษส่วน 23 บิตของส่วนสำคัญ เท่านั้น ที่ปรากฏในรูปแบบหน่วยความจำ แต่ความแม่นยำโดยรวมคือ 24 บิต (เทียบเท่ากับ log 10 (2 24 ) ≈ 7.225 หลักทศนิยม) สำหรับค่าปกติ ส่วนตัวเลขซับนอร์มอลจะมีความแม่นยำลดลงอย่างนุ่มนวลจนถึง 1 บิตสำหรับค่าที่ไม่ใช่ศูนย์ที่เล็กที่สุด

ส่วนประกอบต่างๆ ถูกจัดเรียงไว้ดังนี้:

ค่าที่แท้จริงที่ได้จากข้อมูลไบนารี 32 บิตที่กำหนด โดยมี เครื่องหมาย ที่กำหนด เลขชี้กำลังไบแอสE (จำนวนเต็มไม่ระบุเครื่องหมาย 8 บิต) และเศษส่วน 23 บิตคือ

,

ซึ่งให้ผลลัพธ์

ในตัวอย่างนี้:

  • ,
  • ,
  • ,
  • ,
  • .

ดังนั้น:

  • .

บันทึก:

  • ,
  • ,
  • ,
  • .

การเข้ารหัสเลขยกกำลัง

เลขชี้กำลังทศนิยมไบนารีความแม่นยำเดี่ยวจะถูกเข้ารหัสโดยใช้ การแสดงค่า ชดเชยไบนารีโดยค่าชดเชยศูนย์คือ 127 ซึ่งเรียกอีกอย่างว่าค่าเบี่ยงเบนเลขชี้กำลังในมาตรฐาน IEEE 754

ดังนั้น เพื่อให้ได้เลขชี้กำลังที่แท้จริงตามที่กำหนดโดยการแสดงผลแบบไบนารีที่มีค่าชดเชย จะต้องลบค่าชดเชย 127 ออกจากเลขชี้กำลังที่จัดเก็บไว้

เลขชี้กำลังที่จัดเก็บไว้ 00 Hและ FF Hจะถูกตีความเป็นพิเศษ

เลขชี้กำลังเศษส่วน = 0เศษส่วน ≠ 0สมการ
00 H = 00000000 2±ศูนย์จำนวนต่ำกว่าปกติ
01 H , ..., FE H = 00000001 2 , ..., 11111110 2ค่าปกติ
FF H = 11111111 2± อนันต์NaN (เงียบ, ส่งสัญญาณ)

ค่าปกติที่เป็นบวกต่ำสุดคือและค่าบวก (ต่ำกว่าปกติ) ต่ำสุดคือ

การแปลงเลขฐานสิบเป็นเลขฐานสอง 32

( เรียนรู้วิธีและเวลาในการลบข้อความนี้ )

โดยทั่วไปแล้ว ให้ดูมาตรฐาน IEEE 754 เองสำหรับวิธีการแปลงที่เข้มงวด (รวมถึงพฤติกรรมการปัดเศษ) ของจำนวนจริงให้เป็นรูปแบบไบนารี 32 ที่เทียบเท่ากัน

ต่อไปนี้คือตัวอย่างวิธีการแปลงจำนวนจริงฐาน 10 ให้เป็นรูปแบบไบนารี 32 ของ IEEE 754:

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

การแปลงส่วนทศนิยม: พิจารณา 0.375 ซึ่งเป็นส่วนทศนิยมของ 12.375 ในการแปลงเป็นเศษส่วนเลขฐานสอง ให้คูณเศษส่วนด้วย 2 นำส่วนจำนวนเต็มมาคูณซ้ำกับเศษส่วนใหม่ด้วย 2 ไปเรื่อยๆ จนกว่าจะได้เศษส่วนเป็นศูนย์ หรือจนกว่าจะถึงขีดจำกัดความแม่นยำ ซึ่งคือ 23 หลักทศนิยมสำหรับรูปแบบ IEEE 754 binary32

ส่วนจำนวนเต็มแสดงถึงหลักเศษส่วนของเลขฐานสอง คูณ 0.750 ด้วย 2 อีกครั้งเพื่อดำเนินการต่อ
เศษส่วน = 0.011 สิ้นสุด

เราจะเห็นว่าสามารถแทนค่าได้อย่างแม่นยำในระบบเลขฐานสองเป็นไม่ใช่ว่าเศษส่วนทศนิยมทั้งหมดจะสามารถแทนค่าได้ในระบบเลขฐานสองที่มีจำนวนหลักจำกัด ตัวอย่างเช่น 0.1 ในระบบเลขฐานสิบไม่สามารถแทนค่าได้อย่างแม่นยำในระบบเลขฐานสอง แต่สามารถแทนค่าโดยประมาณได้เท่านั้น ดังนั้น:

เนื่องจากรูปแบบไบนารี 32 ของ IEEE 754 กำหนดให้ค่าจริงต้องแสดงในรูปแบบ (ดูตัวเลขปกติ , ตัวเลขที่ไม่ปกติ ) ดังนั้น 1100.011 จึงถูกเลื่อนไปทางขวา 3 หลักเพื่อให้ได้เป็น

สุดท้ายนี้ เราสามารถสรุปได้ว่า:

จากนั้นเราจึงสรุปได้ว่า:

  • เลขชี้กำลังคือ 3 (และในรูปแบบที่เอนเอียงจึงเป็น)
  • เศษส่วนคือ 100011 (เมื่อมองไปทางด้านขวาของจุดทศนิยม)

จากข้อมูลเหล่านี้ เราสามารถสร้างรูปแบบไบนารี 32 บิต IEEE 754 ที่แสดงค่า 12.375 ได้ดังนี้:

หมายเหตุ: ลองแปลง 68.123 เป็นรูปแบบไบนารี 32 ของ IEEE 754: โดยใช้ขั้นตอนข้างต้น คุณคาดว่าจะได้ค่าที่มี 4 บิตสุดท้ายเป็น 1001 อย่างไรก็ตาม เนื่องจากพฤติกรรมการปัดเศษเริ่มต้นของรูปแบบ IEEE 754 สิ่งที่คุณได้คือค่าที่มี 4 บิตสุดท้ายเป็น 1010

ตัวอย่างที่ 1: พิจารณาเลขฐานสิบ 1 เราจะเห็นว่า:

จากนั้นเราจึงสรุปได้ว่า:

  • เลขชี้กำลังคือ 0 (และในรูปแบบที่มีอคติจึงเป็นเช่นนั้น)
  • เศษส่วนคือ 0 (เมื่อมองไปทางขวาของจุดทศนิยมใน 1.0 จะได้ค่าเป็น 0 ทั้งหมด)

จากข้อมูลเหล่านี้ เราสามารถสร้างรูปแบบไบนารี 32 บิต IEEE 754 ที่แสดงถึงเลขจำนวนจริง 1 ได้ดังนี้:

ตัวอย่างที่ 2: พิจารณาค่า 0.25 เราจะเห็นได้ว่า:

จากนั้นเราจึงสรุปได้ว่า:

  • เลขชี้กำลังคือ −2 (และในรูปแบบที่เอนเอียงคือ)
  • เศษส่วนคือ 0 (เมื่อมองไปทางขวาของจุดทศนิยมใน 1.0 จะเห็นแต่เลขศูนย์)

จากข้อมูลเหล่านี้ เราสามารถสร้างการแสดงค่าเลขจำนวนจริง 0.25 ในรูปแบบไบนารี 32 บิตตามมาตรฐาน IEEE 754 ได้ดังนี้:

ตัวอย่างที่ 3: พิจารณาค่า 0.375 เราได้เห็นแล้วว่า

ดังนั้น หลังจากกำหนดค่าแทน 0.375 แล้วเราสามารถดำเนินการต่อได้ตามที่กล่าวมาข้างต้น:

  • เลขชี้กำลังคือ −2 (และในรูปแบบที่เอนเอียงคือ)
  • เศษส่วนคือ 1 (เมื่อมองไปทางขวาของจุดทศนิยมใน 1.1 จะเห็นเลขเดี่ยว)

จากข้อมูลเหล่านี้ เราสามารถสร้างการแสดงค่าเลขจำนวนจริง 0.375 ในรูปแบบไบนารี 32 บิต IEEE 754 ได้ดังนี้:

การแปลงเลขฐานสอง 32 เป็นเลขฐานสิบ

(Learn how and when to remove this message)

ถ้าค่า binary32 ซึ่ง ในตัวอย่างนี้คือ 41C80000อยู่ในรูปแบบเลขฐานสิบหก เราจะต้องแปลงเป็นเลขฐานสองก่อน:

จากนั้นเราจะแยกย่อยออกเป็นสามส่วน ได้แก่ ส่วนเครื่องหมาย เลขชี้กำลัง และส่วนสำคัญ

จากนั้นเราจะเพิ่มบิตที่ 24 ที่ซ่อนอยู่เข้าไปในส่วนสำคัญ:

และถอดรหัสค่าเลขชี้กำลังโดยการลบ 127:

แต่ละบิตจากทั้งหมด 24 บิตของส่วนสำคัญ (รวมถึงบิตที่ 24 โดยปริยาย) ตั้งแต่บิตที่ 23 ถึงบิตที่ 0 แทนค่า โดยเริ่มจาก 1 และลดลงครึ่งหนึ่งสำหรับแต่ละบิต ดังนี้:

บิตที่ 23 = 1 บิตที่ 22 = 0.5 บิตที่ 21 = 0.25 บิตที่ 20 = 0.125 บิตที่ 19 = 0.0625 บิตที่ 18 = 0.03125 บิตที่ 17 = 0.015625 . . บิตที่ 6 = 0.00000762939453125 บิตที่ 5 = 0.000003814697265625 บิตที่ 4 = 0.0000019073486328125 บิตที่ 3 = 0.00000095367431640625 บิตที่ 2 = 0.000000476837158203125 บิต 1 = 0.0000002384185791015625 บิต 0 = 0.00000011920928955078125 

ในตัวอย่างนี้ ตัวเลขสำคัญ (significand) มีบิตที่ถูกตั้งค่าไว้ 3 บิต ได้แก่ บิตที่ 23, บิตที่ 22 และบิตที่ 19 เราสามารถถอดรหัสตัวเลขสำคัญได้โดยการบวกค่าที่แสดงโดยบิตเหล่านี้

จากนั้นเราต้องคูณด้วยฐาน 2 ยกกำลังด้วยเลขชี้กำลัง เพื่อให้ได้ผลลัพธ์สุดท้าย:

ดังนั้น

สิ่งนี้เทียบเท่ากับ:

โดยที่sคือบิตเครื่องหมาย, xคือเลขชี้กำลัง และmคือส่วนสำคัญ

ข้อจำกัดด้านความแม่นยำของค่าทศนิยม (ระหว่าง 1 ถึง 16777216)

ข้อจำกัดด้านความแม่นยำของค่าจำนวนเต็ม

กรณีความแม่นยำเดี่ยวที่โดดเด่น

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

0 00000000 000000000000000000000012= 0000 000116= 2 −126 × 2 −23 = 2 −149 ≈ 1.4012984643 × 10 −45                                       (จำนวนย่อยปกติที่เป็นบวกที่เล็กที่สุด)

0 00000000 111111111111111111111112= 007f ffff16= 2 −126 × (1 − 2 −23 ) ≈ 1.1754942107 × 10 −38                                       (จำนวนย่อยปกติที่ใหญ่ที่สุด)

0 00000001 000000000000000000000002= 0080 000016= 2 −126 ≈ 1.1754943508 × 10 −38                                       (จำนวนปกติบวกที่เล็กที่สุด)

0 11111110 111111111111111111111112= 7f7f ffff16= 2 127 × (2 − 2 −23 ) ≈ 3.4028234664 × 10 38                                       (จำนวนปกติที่มากที่สุด)

0 01111110 111111111111111111111112= 3f7f ffff16= 1 − 2 −24 ≈ 0.999999940395355225                                       (จำนวนที่มากที่สุดที่น้อยกว่าหนึ่ง)

0 01111111 000000000000000000000002= 3f80 000016= 1 (หนึ่ง)

0 01111111 000000000000000000000012= 3f80 000116= 1 + 2 −23 ≈ 1.00000011920928955                                       (จำนวนที่น้อยที่สุดที่มากกว่าหนึ่ง)

1 10000000 000000000000000000000002= c000 000016= −2 0 00000000 000000000000000000000002= 0000 000016= 0 1 00000000 000000000000000000000002= 8,000,00016= −0

0 11111111 000000000000000000000002= 7f80 000016= อนันต์ 1 11111111 000000000000000000000002= ff80 000016= −อนันต์

0 01111101 010101010101010101010112= 3eaa aaab16≈ 0.333333343267440796 ≈ 1/3 0 10000000 100100100001111110110112= 4049 0fdb16µ 3.14159274101257324 µ π (ไพ)

x 11111111 100000000000000000000012= ffc0 000116= qNaN (บนโปรเซสเซอร์ x86 และ ARM) x 11111111 0000000000000000000000012= ff80 000116= sNaN (บนโปรเซสเซอร์ x86 และ ARM)

โดยปกติแล้ว 1/3 จะปัดขึ้น แทนที่จะปัดลงเหมือนกับเลขทศนิยมสองเท่าเนื่องจากจำนวนบิตในส่วนสำคัญเป็นเลขคู่ บิตของ 1/3 ที่อยู่เลยจุดปัดเศษไปจะ1010...มีค่ามากกว่า 1/2 ของหน่วยในหลักสุดท้าย

มาตรฐาน IEEE 754ไม่ได้ระบุวิธีการเข้ารหัส qNaN และ sNaN และมีการใช้งานที่แตกต่างกันในโปรเซสเซอร์แต่ละชนิด โปรเซสเซอร์ตระกูล x86และARMใช้บิตที่มีค่ามากที่สุดในฟิลด์ significand เพื่อระบุค่าNaN ที่ไม่มีการเปลี่ยนแปลง ในขณะที่โปรเซสเซอร์ PA -RISCใช้บิตดังกล่าวเพื่อระบุค่าNaN ที่มีการส่งสัญญาณ

การเพิ่มประสิทธิภาพ

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

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Single-precision_floating-point_format&oldid=1353774695 "

สรุปเนื้อหา

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

ข้อมูลสำคัญเกี่ยวกับ รูปแบบจุดลอยตัวความแม่นยำเดี่ยว

รูปแบบเลขทศนิยมความแม่นยำเดี่ยว (บางครั้งเรียกว่า FP32 , float32 หรือ float ) เป็น รูปแบบตัวเลขคอมพิวเตอร์ ซึ่งโดยทั่วไปจะใช้พื้นที่ 32 บิต ใน หน่วย ความ จำคอมพิวเตอร์...

มาตรฐาน IEEE 754: binary32

มาตรฐาน IEEE 754 ระบุว่า binary32 มีคุณสมบัติดังนี้:

การเข้ารหัสเลขยกกำลัง

เลขชี้กำลังทศนิยมไบนารีความแม่นยำเดี่ยวจะถูกเข้ารหัสโดยใช้ การแสดงค่า ชดเชยไบนารี โดยค่าชดเชยศูนย์คือ 127 ซึ่งเรียกอีกอย่างว่าค่าเบี่ยงเบนเลขชี้กำลังในมาตรฐาน IEEE 754

การแปลงเลขฐานสิบเป็นเลขฐานสอง 32

โดยทั่วไปแล้ว ให้ดูมาตรฐาน IEEE 754 เองสำหรับวิธีการแปลงที่เข้มงวด (รวมถึงพฤติกรรมการปัดเศษ) ของจำนวนจริงให้เป็นรูปแบบไบนารี 32 ที่เทียบเท่ากัน