ทุกคนสามารถอธิบายการเป็นตัวแทนของโฟลตในหน่วยความจำได้หรือไม่?


20

นี่ไม่ใช่คำถามซ้ำซ้อนเมื่อฉันอ่านคำถามก่อนหน้า

how float values are stored in the memoryทุกคนสามารถช่วยในการทำความเข้าใจ

ข้อสงสัยของฉันอยู่ที่นี่ค่าลอยมี ' .'( for example 3.45) วิธี'.'จะแสดงในหน่วยความจำ?

ใครช่วยอธิบายแผนที่ด้วยฉันได้ไหม?


21
วิกิพีเดียเป็นแหล่งที่มาที่น้อยที่สุดหรือไม่ en.wikipedia.org/wiki/Floating_point#Internal_representation
9000

4
และคุณสามารถเพิ่มบทความหลัก: IEEE floating point
mouviciel

4
หากคุณเป็นเหมือนฉันและคุณชอบที่จะเรียนรู้ด้วยการเล่นกับสิ่งต่าง ๆ การใส่อินพุทและการรับเอาท์พุท ฯลฯ ลองเข้าไปที่เว็บไซต์นี้: binaryconvert.com/convert_double.html
KChaloux

รูปแบบจุดลอยตัวของ WIDE มีความหลากหลายแตกต่างกันทั้งหมด จุดลอยตัว IEEE เป็นจุดที่พบได้บ่อยที่สุดในปัจจุบัน แต่ก็ไม่ใช่จุดเดียว เมื่อตอนที่ฉันเรียนปริญญาตรีฉันต้องเรียนรู้รูปแบบจุดลอยตัว CDC 6600 และมีข้อได้เปรียบเหนือ IEEE ที่ใหญ่ที่สุดคือ 48 บิตของ mantissa สำหรับความแม่นยำเดียว IEEE ถูก จำกัด ไว้ที่ mantissa ประมาณ 24 บิตสำหรับความแม่นยำเดียวซึ่งเป็นเหตุผลว่าทำไมทุก ๆ คลาสของวิธีการคำนวณเบื้องต้นในชั้นเรียนวันนี้จึงบอกนักเรียนว่า
John R. Strohm

ดูfloating-point-gui.deและจำ URL นั้น
Basile Starynkevitch

คำตอบ:


44

จุดทศนิยมจะไม่ถูกจัดเก็บอย่างชัดเจนทุกที่ นั่นเป็นปัญหาการแสดงผล

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

เริ่มต้นด้วยการแสดงค่าทศนิยมในตัวแปรของสัญกรณ์วิทยาศาสตร์โดยใช้ฐาน 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 ระวังเมื่อคูณจำนวนมาก (ในแง่ของขนาด) คูณด้วยจำนวนที่น้อยมาก


"แต่แทนที่จะสำรองบิตเครื่องหมายอื่น" สิ่งที่คุณกำลังอธิบายคือพฤติกรรมที่แน่นอนของจำนวนเต็มที่ลงนามแล้ว
Simon

6

.ไม่ได้เก็บไว้ในทุก ก่อนอื่นคุณควรเข้าใจสัญกรณ์ทางวิศวกรรมซึ่งมีปัจจัยความแม่นยำคงที่และเลขชี้กำลังเลขจำนวนเต็ม: 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 ขนาดที่แน่นอนของแต่ละส่วนขึ้นอยู่กับมาตรฐานจุดลอยตัวที่แน่นอนที่คุณใช้


3
นี่คือ "สัญกรณ์ทางวิทยาศาสตร์" "สัญลักษณ์ทางวิศวกรรม" คือเมื่อเลขชี้กำลังถูก จำกัด ไว้ที่ทวีคูณของ 3
Clement J.

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

1
@delnan: ถ้ามันช่วยได้บิตแต่ละ mantissa จะเป็นครึ่งหนึ่งของบิตที่สูงกว่า ดังนั้นการลอยสามารถเก็บผลบวกลบของสอง: 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128 และอื่น ๆ จนถึงขีด จำกัด ของ mantissa . เอปไซลอนในรูปแบบ 32 บิตfloatคือ2^-22 * exponentประมาณ 1/4194304
greyfade
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.