นี่ไม่ใช่คำถามซ้ำซ้อนเมื่อฉันอ่านคำถามก่อนหน้า
how float values are stored in the memory
ทุกคนสามารถช่วยในการทำความเข้าใจ
ข้อสงสัยของฉันอยู่ที่นี่ค่าลอยมี ' .'
( for example 3.45
) วิธี'.'
จะแสดงในหน่วยความจำ?
ใครช่วยอธิบายแผนที่ด้วยฉันได้ไหม?
นี่ไม่ใช่คำถามซ้ำซ้อนเมื่อฉันอ่านคำถามก่อนหน้า
how float values are stored in the memory
ทุกคนสามารถช่วยในการทำความเข้าใจ
ข้อสงสัยของฉันอยู่ที่นี่ค่าลอยมี ' .'
( for example 3.45
) วิธี'.'
จะแสดงในหน่วยความจำ?
ใครช่วยอธิบายแผนที่ด้วยฉันได้ไหม?
คำตอบ:
จุดทศนิยมจะไม่ถูกจัดเก็บอย่างชัดเจนทุกที่ นั่นเป็นปัญหาการแสดงผล
คำอธิบายต่อไปนี้เป็นการทำให้เข้าใจง่าย; ฉันออกจากออกจำนวนมากของรายละเอียดที่สำคัญและตัวอย่างของฉันไม่ได้หมายถึงตัวแทนของแพลตฟอร์มโลกแห่งความจริงใด ๆ ควรให้รสชาติของวิธีการที่ค่าจุดลอยตัวจะแสดงในหน่วยความจำและประเด็นที่เกี่ยวข้องกับพวกเขา แต่คุณจะต้องการหาแหล่งที่มาของอำนาจมากขึ้นเช่นสิ่งที่ทุกนักวิทยาศาสตร์คอมพิวเตอร์ควรรู้เกี่ยวกับจุดลอยเลขคณิต
เริ่มต้นด้วยการแสดงค่าทศนิยมในตัวแปรของสัญกรณ์วิทยาศาสตร์โดยใช้ฐาน 2 แทนฐาน 10 ตัวอย่างเช่นค่า 3.14159 สามารถแสดงเป็น
0.7853975 * 2 2
0.7853975 เป็นซิกอาคา mantissa นั้น มันเป็นส่วนหนึ่งของจำนวนที่มีตัวเลขที่สำคัญ ค่านี้จะถูกคูณด้วยฐาน 2 ยกกำลัง 2 เพื่อรับ 3.14159
จำนวนจุดลอยตัวจะถูกเข้ารหัสโดยการจัดเก็บซิกนิฟิแคนด์และเลขชี้กำลัง (พร้อมเครื่องหมายบิต)
เค้าโครงแบบ 32 บิตโดยทั่วไปมีลักษณะดังนี้:
3 32222222 22211111111110000000000
1 09876543 21098765432109876543210
+-+--------+-----------------------+
| | | |
+-+--------+-----------------------+
^ ^ ^
| | |
| | +-- significand
| |
| +------------------- exponent
|
+------------------------ sign bit
เช่นเดียวกับชนิดจำนวนเต็มที่ลงนามบิตลำดับสูงหมายถึงเครื่องหมาย 0 หมายถึงค่าบวก 1 หมายถึงลบ
8 บิตถัดไปใช้สำหรับเลขชี้กำลัง เลขชี้กำลังสามารถเป็นค่าบวกหรือลบได้ แต่แทนที่จะจองบิตสัญญาณอื่นพวกเขาจะถูกเข้ารหัสเช่นนั้น 10,000,000 หมายถึง 0 ดังนั้น 00000000 หมายถึง -128 และ 11111111 แทน 127
บิตที่เหลือจะถูกใช้สำหรับซิกนิฟิแคนด์ แต่ละบิตแทนค่าลบของการนับ 2 ทางซ้ายดังนั้น:
01101 = 0 * 2 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * 2 -4 + 1 * 2 -5 = 0.25 + 0.125 + 0.03125 = 0.40625
บางแพลตฟอร์มถือว่าบิตนำที่ซ่อนอยู่ในซิกนิฟิแคนด์นั้นถูกตั้งค่าเป็น 1 เสมอดังนั้นค่าในซิกนิฟิแคนด์จะอยู่ระหว่าง [0.5, 1) สิ่งนี้ช่วยให้แพลตฟอร์มเหล่านี้เก็บค่าที่มีความแม่นยำสูงขึ้นเล็กน้อย (เพิ่มเติมจากด้านล่าง) ตัวอย่างของฉันไม่ได้ทำเช่นนี้
ดังนั้นค่าของเราที่ 3.14159 จะถูกแทนด้วย
0 10000010 110010010000111111111111 ^ ^ ^ | | | | | + --- ซิกนิแคนด์ = 0.7853975 ... | | | + ------------------- เลขชี้กำลัง = 2 (130 - 128) | + ------------------------- sign = 0 (บวก) value = -1 (เครื่องหมาย) * 2 (เลขชี้กำลัง) * ( ซิกนิฟิแคนด์ ) ค่า = -1 0 * 2 2 * 0.7853975 ... ค่า = 3.14159 ...
ทีนี้บางสิ่งที่คุณจะสังเกตเห็นถ้าคุณบวกบิตทั้งหมดในซิกนิฟิแคนด์นั่นคือพวกมันไม่ได้รวม 0.7853975; พวกเขาออกมาจริง ๆ ที่ 0.78539747 มีไม่บิตมากพอที่จะเก็บค่าตรง ; เราสามารถเก็บค่าประมาณได้เท่านั้น จำนวนบิตในซิกนิฟิแคนด์เป็นตัวกำหนดความแม่นยำหรือจำนวนเลขนัยสำคัญที่คุณสามารถเก็บได้ 23 บิตทำให้เรามีความแม่นยำประมาณ 6 หลักทศนิยม ชนิดจุดลอยตัว 64- บิตเสนอบิตเพียงพอในซิกนิฟิแคนด์เพื่อให้ความแม่นยำประมาณ 12 ถึง 15 หลัก แต่ระวังว่ามีค่าที่ไม่สามารถแสดงได้อย่างแน่นอนไม่ว่าจะเป็นอย่างไรคุณใช้หลายบิต เช่นเดียวกับค่าเช่น 1/3 ไม่สามารถแสดงเป็นจำนวนทศนิยมแบบดิจิตัลได้ค่าเช่น 1/10 ไม่สามารถแสดงเป็นจำนวนบิตบิตได้ เนื่องจากค่าเป็นค่าประมาณการคำนวณด้วยจึงเป็นค่าโดยประมาณและมีข้อผิดพลาดในการปัดเศษสะสม
จำนวนบิตในเลขชี้กำลังเป็นตัวกำหนดช่วง (ค่าต่ำสุดและค่าสูงสุดที่คุณสามารถแทนค่าได้) แต่เมื่อคุณเลื่อนไปยังค่าต่ำสุดและสูงสุดขนาดของช่องว่างระหว่างค่าที่สามารถแทนได้จะเพิ่มขึ้น นั่นคือถ้าคุณไม่สามารถแสดงค่าระหว่าง 0.785397 ถึง 0.785398 ได้อย่างแน่นอนคุณจะไม่สามารถแทนค่าระหว่าง 7.85397 และ 7.85398 ได้อย่างแน่นอนหรือค่าระหว่าง 78.5397 ถึง 78.5398 หรือค่าระหว่าง 785397.0 และ 785398.0 ระวังเมื่อคูณจำนวนมาก (ในแง่ของขนาด) คูณด้วยจำนวนที่น้อยมาก
.
ไม่ได้เก็บไว้ในทุก ก่อนอื่นคุณควรเข้าใจสัญกรณ์ทางวิศวกรรมซึ่งมีปัจจัยความแม่นยำคงที่และเลขชี้กำลังเลขจำนวนเต็ม: 1
คือ 1.0 · 10 0 = 1.0E0
, 2 คือ2.0E0
, 10 คือ1.0E1
เป็นต้นซึ่งจะช่วยให้มีสัญกรณ์สั้นจำนวนมาก 1.0E9
หนึ่งพันล้าน ปัจจัยที่ก่อนE
มักจะ notated 1.00000E9
เป็นจำนวนคงที่มีความแม่นยำ: ผลที่ตามมาก็คือจำนวนหนึ่งพันล้านและหนึ่ง = 1,000,000,001 และหนึ่งพันล้านนั้นเหมือนกันในสัญกรณ์นี้เมื่อความแม่นยำไม่มากพอ โปรดทราบว่าปัจจัยไม่จำเป็นต้องมีศูนย์นำหน้า เลขชี้กำลังสามารถลดขนาดลงได้จนกว่าจะไม่มีอีกต่อไป
ในหน่วยความจำจำนวนจุดลอยตัวจะแสดงในทำนองเดียวกัน: หนึ่งบิตมีเครื่องหมายบางบิตก่อตัวเป็นปัจจัยที่เป็นตัวเลขที่มีความแม่นยำคงที่ (“ แมนทิสซา”) บิตที่เหลือเป็นรูปแบบเลขชี้กำลัง ความแตกต่างที่สำคัญกับสัญกรณ์วิศวกรรมฐาน 10 คือแน่นอนว่าตอนนี้เลขชี้กำลังมีฐาน 2 ขนาดที่แน่นอนของแต่ละส่วนขึ้นอยู่กับมาตรฐานจุดลอยตัวที่แน่นอนที่คุณใช้
float
คือ2^-22 * exponent
ประมาณ 1/4194304