อ่าน 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 ส่วนใหญ่ และระบบฝังตัว บางระบบ ความแม่นยำที่รองรับเพียงอย่างเดียวคือความแม่นยำ เดี่ยว
| รูปแบบจุดลอยตัว |
|---|
| อีไออี 754 |
|
| อื่น |
| ทางเลือกอื่นๆ |
| จุดลอยตัวแบบเรียว |
มาตรฐาน IEEE 754: binary32
มาตรฐาน IEEE 754 ระบุว่าbinary32มีคุณสมบัติดังนี้:
- บิตเครื่องหมาย : 1 บิต
- ความกว้าง ของเลขชี้กำลัง : 8 บิต
- ความแม่นยำของตัวเลขสำคัญ : 24 บิต (จัดเก็บไว้โดยชัดเจน 23 บิต)
สิ่งนี้ให้ความแม่นยำ ของตัวเลขทศนิยมที่มีนัยสำคัญตั้งแต่ 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
- E min = 01 H −7F H = −126
- E max = FE H −7F H = 127
- ค่าเบี่ยงเบนเลขชี้กำลัง = 7F H = 127
ดังนั้น เพื่อให้ได้เลขชี้กำลังที่แท้จริงตามที่กำหนดโดยการแสดงผลแบบไบนารีที่มีค่าชดเชย จะต้องลบค่าชดเชย 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 ได้ดังนี้: