ในภาษาการเขียนโปรแกรมส่วนใหญ่จำนวนจุดลอยตัวจะมีจำนวนมากเช่นสัญกรณ์วิทยาศาสตร์ : ด้วยเลขชี้กำลังและแมนทิสซา (เรียกอีกอย่างว่าซิกนิฟิแคนด์) จำนวนที่ง่ายมากพูด9.2
เป็นเศษส่วนนี้:
5179139571476070 * 2 -49
ที่ไหนเลขชี้กำลังเป็น-49
และ mantissa 5179139571476070
คือ เหตุผลที่เป็นไปไม่ได้ที่จะแสดงตัวเลขทศนิยมบางส่วนด้วยวิธีนี้คือทั้งเลขชี้กำลังและแมนทิสซาต้องเป็นจำนวนเต็ม ในคำอื่น ๆ ลอยทั้งหมดต้องเป็นจำนวนเต็มคูณโดยอำนาจจำนวนเต็มของ 2
9.2
อาจจะง่าย92/10
แต่10ไม่สามารถแสดงเป็น2 nหากnถูก จำกัด ด้วยค่าจำนวนเต็ม
เห็นข้อมูล
ครั้งแรกที่ฟังก์ชั่นบางอย่างเพื่อดูส่วนประกอบที่ทำให้ 32 และ float
64 เงาเหนือสิ่งเหล่านี้หากคุณสนใจเฉพาะผลลัพธ์ (ตัวอย่างใน Python):
def float_to_bin_parts(number, bits=64):
if bits == 32: # single precision
int_pack = 'I'
float_pack = 'f'
exponent_bits = 8
mantissa_bits = 23
exponent_bias = 127
elif bits == 64: # double precision. all python floats are this
int_pack = 'Q'
float_pack = 'd'
exponent_bits = 11
mantissa_bits = 52
exponent_bias = 1023
else:
raise ValueError, 'bits argument must be 32 or 64'
bin_iter = iter(bin(struct.unpack(int_pack, struct.pack(float_pack, number))[0])[2:].rjust(bits, '0'))
return [''.join(islice(bin_iter, x)) for x in (1, exponent_bits, mantissa_bits)]
มีความซับซ้อนมากมายที่อยู่เบื้องหลังฟังก์ชั่นนั้นและมันก็ค่อนข้างจะแทนเจนต์ที่จะอธิบาย แต่ถ้าคุณสนใจทรัพยากรที่สำคัญสำหรับวัตถุประสงค์ของเราคือโมดูลstruct
Python float
เป็นหมายเลข 64 บิตความแม่นยำสองเท่า ในภาษาอื่นเช่น C, C ++, Java และ C #, double-precision มีประเภทที่แยกต่างหากdouble
ซึ่งมักจะถูกนำมาใช้เป็น 64 บิต
เมื่อเราเรียกฟังก์ชันนั้นด้วยตัวอย่างของเรา9.2
นี่คือสิ่งที่เราได้รับ:
>>> float_to_bin_parts(9.2)
['0', '10000000010', '0010011001100110011001100110011001100110011001100110']
การตีความข้อมูล
คุณจะเห็นว่าฉันแบ่งค่าตอบแทนเป็นสามองค์ประกอบ ส่วนประกอบเหล่านี้คือ:
- สัญญาณ
- ตัวแทน
- Mantissa (เรียกอีกอย่างว่า Significand หรือเศษส่วน)
สัญญาณ
เครื่องหมายถูกเก็บไว้ในองค์ประกอบแรกเป็นบิตเดียว ง่ายต่อการอธิบาย: 0
หมายความว่าจำนวนลอยเป็นจำนวนบวก 1
หมายความว่ามันเป็นลบ เพราะเป็นบวกค่าสัญญาณของเราคือ9.2
0
ตัวแทน
เลขชี้กำลังจะถูกเก็บไว้ในองค์ประกอบกลางเป็น 11 บิต 0b10000000010
ในกรณีของเรา 1026
ในทศนิยมที่แสดงถึงความคุ้มค่า องค์ประกอบที่แปลกประหลาดขององค์ประกอบนี้คือคุณต้องลบจำนวนเท่ากับ2 (# ของบิต) - 1 - 1เพื่อให้ได้เลขชี้กำลังที่แท้จริง ในกรณีของเรานั่นหมายถึงการลบ 0b1111111111
(เลขฐานสิบ1023
) เพื่อให้ได้เลขชี้กำลังจริง0b00000000011
(จำนวนทศนิยม 3)
เลขแม็นทีซซะ
mantissa ถูกเก็บไว้ในองค์ประกอบที่สามเป็น 52 bits อย่างไรก็ตามมีองค์ประกอบขององค์ประกอบนี้เช่นกัน หากต้องการทำความเข้าใจกับการเล่นโวหารนี้พิจารณาตัวเลขในสัญกรณ์ทางวิทยาศาสตร์เช่นนี้
6.0221413x10 23
mantissa 6.0221413
จะเป็น จำได้ว่าแมนทิสซาในรูปแบบทางวิทยาศาสตร์มักจะเริ่มต้นด้วยตัวเลขที่ไม่ใช่ศูนย์เดียว เดียวกันถือเป็นจริงสำหรับไบนารียกเว้นไบนารีที่มีเพียงตัวเลขสองหลัก: และ0
1
ดังนั้นไบนารีแมนทิสซาจึงเริ่มต้นด้วยเสมอ1
! เมื่อโฟลว์ถูกเก็บไว้1
ด้านหน้าของไบนารีแมนทิสซาจะถูกละเว้นเพื่อประหยัดพื้นที่ เราต้องวางมันกลับไปที่ด้านหน้าขององค์ประกอบที่สามของเราเพื่อรับแมนทิสซาที่แท้จริง :
1,0010011001100110011001100110011001100110011001100110
นี้เกี่ยวข้องกับการมากกว่าเพียงแค่นอกจากนี้ง่ายเพราะบิตที่เก็บไว้ในองค์ประกอบที่สามของเราจริงเป็นตัวแทนของเศษส่วนส่วนหนึ่งของ mantissa ทางด้านขวาของจุดฐาน
เมื่อจัดการกับตัวเลขทศนิยมเรา "ย้ายจุดทศนิยม" โดยการคูณหรือหารด้วยพลังของ 10 ในไบนารีเราสามารถทำสิ่งเดียวกันโดยการคูณหรือหารด้วยพลังของ 2 เนื่องจากองค์ประกอบที่สามของเรามี 52 บิตเราแบ่ง โดย2 52เพื่อย้าย 52 ตำแหน่งไปทางขวา:
0,0010011001100110011001100110011001100110011001100110
ในสัญกรณ์ทศนิยมที่เป็นเช่นเดียวกับการหาร675539944105574
โดยที่จะได้รับ4503599627370496
0.1499999999999999
(นี่คือตัวอย่างหนึ่งของอัตราส่วนที่สามารถแสดงได้อย่างชัดเจนในรูปแบบไบนารี แต่โดยประมาณเป็นทศนิยมเท่านั้นสำหรับรายละเอียดเพิ่มเติมดูที่: 675539944105574/4503599627370496 )
ตอนนี้เราได้เปลี่ยนองค์ประกอบที่สามเป็นตัวเลขเศษส่วนแล้วการเพิ่ม1
จะทำให้ mantissa จริง
การจัดองค์ประกอบใหม่
- เครื่องหมาย (องค์ประกอบแรก):
0
สำหรับค่าบวก, 1
ค่าลบ
- เลขชี้กำลัง (องค์ประกอบกลาง): ลบ2 (# ของบิต) - 1 - 1เพื่อให้ได้เลขชี้กำลังที่แท้จริง
- Mantissa (องค์ประกอบสุดท้าย): หารด้วย2 (# ของบิต)และเพิ่ม
1
เพื่อรับ mantissa จริง
การคำนวณจำนวน
การนำทั้งสามส่วนเข้าด้วยกันเราจะได้เลขฐานสองนี้:
1.00100110011001100110011001100110011001100110011001100110011001100 11
ซึ่งเราสามารถแปลงจากเลขฐานสองเป็นทศนิยม:
1.1499999999999999 x 2 3 (ไม่แน่นอน!)
และคูณเพื่อแสดงการแทนค่าสุดท้ายของหมายเลขที่เราเริ่มต้นด้วย ( 9.2
) หลังจากถูกเก็บเป็นค่าทศนิยม
9.1999999999999993
แสดงว่าเป็นเศษส่วน
9.2
ตอนนี้เราได้สร้างตัวเลขแล้วมันเป็นไปได้ที่จะสร้างมันใหม่เป็นเศษส่วนง่ายๆ:
1.00100110011001100110011001100110011001100110011001100110011001100 11
เปลี่ยน mantissa เป็นจำนวนเต็ม:
10010011001100110011001100110011001100110011001100110011001100 x 10 11-110100
แปลงเป็นทศนิยม:
5179139571476070 x 2 3-52
ลบเลขชี้กำลัง:
5179139571476070 x 2 -49
เปลี่ยนเลขชี้กำลังเป็นค่าลบเป็นหมวด:
5179139571476070/2 49
ตัวแทนทวีคูณ:
5179139571476070/562949953421312
ซึ่งเท่ากับ:
9.1999999999999993
9.5
>>> float_to_bin_parts(9.5)
['0', '10000000010', '0011000000000000000000000000000000000000000000000000']
ตอนนี้คุณสามารถเห็นแมนทิสสาเป็นเพียงตัวเลข 4 หลักตามด้วยศูนย์ทั้งหมด แต่ขอผ่านก้าว
ประกอบสัญกรณ์ทางวิทยาศาสตร์ไบนารี:
1.0011 x 10 11
เลื่อนจุดทศนิยม:
10011 x 10 11-100
ลบเลขชี้กำลัง:
10011 x 10 -1
ไบนารีถึงทศนิยม:
19 x 2 -1
เลขชี้กำลังเป็นลบถึงส่วน:
19/2 1
ตัวแทนทวีคูณ:
19/2
เท่ากับ:
9.5
อ่านเพิ่มเติม