เหตุใดการแทนค่าทศนิยมจึงใช้เครื่องหมายบิตแทนส่วนเติม 2 เพื่อระบุจำนวนลบ


20

พิจารณาการเป็นตัวแทนจุดคงที่ซึ่งถือได้ว่าเป็นกรณีที่เลวลงของจำนวนลอย เป็นไปได้ทั้งหมดที่จะใช้ส่วนเติมเต็มของ 2 สำหรับจำนวนลบ แต่ทำไมบิตเครื่องหมายจำเป็นสำหรับตัวเลขจุดลอยตัวทำไม mantissa บิตไม่ควรใช้ส่วนเติมเต็มของ 2?

นอกจากนี้ทำไมบิตเลขชี้กำลังใช้อคติแทนการแทนขนาด - เซ็นชื่อ (คล้ายกับบิตแมนทิสสา) หรือการเป็นตัวแทนของ 2

อัปเดต: ขออภัยถ้าฉันไม่ได้ทำให้ชัดเจน ฉันกำลังค้นหาสาเหตุของการแสดงจุดลอยตัวที่มีรูปร่างอย่างไร หากไม่มีการดำเนินการอย่างจริงจังในการแลกเปลี่ยนระหว่างทางเลือกใครบางคนสามารถอธิบายแง่มุมทางประวัติศาสตร์ของการเป็นตัวแทนจุดลอยตัวได้หรือไม่?

คำตอบ:


7

ส่วนประกอบของสองนั้นสมเหตุสมผลเมื่อหน่วยงานทั้งสองที่สงสัยมี "หน่วย" เดียวกันและ "ความกว้าง" เดียวกัน ตามความกว้างฉันหมายความว่าถ้าคุณเพิ่มหมายเลข N บิตและหมายเลข M บิตโดยที่ N และ M แตกต่างกันคุณควรใช้ส่วนเติมเต็มสอง สำหรับเลขทศนิยมเรามีปัญหาหน่วย: ถ้าเลขชี้กำลังแตกต่างกันเราจะเปลี่ยนหนึ่งใน mantissas และตอนนี้เราก็มีปัญหาเดียวกันกับที่เคยเป็น (ความกว้าง)

สำหรับบิตเลขชี้กำลังโดยใช้อคติแทนเครื่องหมาย + ขนาดเราได้รับค่าอีกหนึ่ง (มิฉะนั้นเราจะมี +0 และ -0) นี่คือส่วนประกอบสองอย่างที่สมเหตุสมผลเมื่อทำการคูณหรือหารตัวเลข (ตั้งแต่นั้นเราจะบวกหรือลบเลขชี้กำลัง) แต่ก็ไม่สมเหตุสมผลเมื่อเพิ่มหรือลบ

แก้ไข: ผู้แสดงความคิดเห็นตั้งข้อสังเกตว่าคุณสามารถเพิ่มจำนวนเต็มส่วนเติมเต็มสองของความยาวที่แตกต่างกันโดยใช้ส่วนขยายสัญญาณ นอกจากนี้ยังมีปัญหาในการตรวจจับการล้น แต่ก็สามารถแก้ไขได้ โดยสรุปคุณอาจใช้ส่วนประกอบสองอย่างถ้าคุณระมัดระวังพอ (คุณต้องจัดการการคูณและการหารด้วย)


4
“ ถ้าคุณกำลังเพิ่มหมายเลข N บิตและหมายเลข M บิตที่ N และ M แตกต่างกันคุณควรใช้ส่วนที่สองของคุณไม่ดีกว่า” - คุณช่วยชี้แจงหน่อยได้ไหม? ฉันเชื่อว่าเป็นไปได้ทั้งหมดที่จะลงชื่อขยายหมายเลขโดยใช้การแสดงส่วนประกอบ 2 โดยใช้ MSB เช่น 4'b1111 จะขยายเป็น 5'b11111 และ 4'b0111 -> 5'b00111 ไม่ควรที่จะเพิ่มสิ่งนี้ไปยังตัวแปลงบาร์เรลที่มีอยู่ภายในตรรกะเลขคณิตจุดลอยตัวใช่หรือไม่
คู

ขอบคุณสำหรับคำตอบ! ฉันได้แก้ไขคำถามเพื่อให้ชัดเจนยิ่งขึ้นเกี่ยวกับสิ่งที่ทำให้จุดลอยตัวในปัจจุบัน
คู

4

จากวิกิพีเดีย:

ระบบสององค์ประกอบเสริมมีข้อได้เปรียบที่การดำเนินการทางคณิตศาสตร์ขั้นพื้นฐานของการบวกการลบและการคูณจะเหมือนกับระบบเลขฐานสองที่ไม่ได้ลงนาม ...

Two's-complement เป็นตัวแทนของจำนวนลบที่เกิดขึ้นเพื่อให้มีความสะดวกมาก นั่นคือเหตุผลทั้งหมดที่จะใช้งานได้เลย

คู่ mantissa- เลขชี้กำลังเป็นตัวแทนของจำนวนจุดลอยตัว เวลาส่วนใหญ่เมื่อใช้หมายเลขทศนิยมคุณไม่ได้ทำเลขคณิตกับ mantissa หรือเลขชี้กำลังเพียงอย่างเดียว


4

แต่ทำไมบิตเครื่องหมายจำเป็นสำหรับหมายเลขจุดลอย

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

ฉันยังห่างไกลจากการเป็นผู้เชี่ยวชาญในการวิเคราะห์เชิงตัวเลข แต่ฉันเข้าใจแล้วว่าการเซ็นชื่อศูนย์มีความสำคัญสำหรับพวกเขา มันอาจจะง่ายกว่าที่จะจัดการกับส่วนเสริม นั่นอาจเป็นเกณฑ์ในการเลือกสำหรับ IEEE-754

นอกจากนี้ทำไมบิตเลขชี้กำลังใช้อคติแทนที่จะเป็นตัวแทนที่มีการเซ็นชื่อขนาด

อีกครั้งมันเป็นสิ่งที่ไม่ต้องการและบางคนก็ทำสิ่งที่แตกต่าง

มันคือการนำเสนอที่ง่ายกว่าในการติดตั้งฮาร์ดแวร์สำหรับชุดของการดำเนินการที่ทำบนเลขชี้กำลัง (และที่นี่มีการแสดงแทนสำหรับ -0 ไม่ต้องการ)

หนึ่งในผลของตัวเลือกนั้นคือคุณสามารถใช้การเปรียบเทียบจำนวนเต็มที่ลงนามเพื่อเปรียบเทียบหมายเลข FP ถ้าคุณไม่สนใจเรื่อง NaN ซึ่งอาจเป็นเกณฑ์สำหรับบางคน (ความจริงกว่า NaN ต้องการการจัดการแบบพิเศษทำให้ฉันสงสัยว่ามันไม่ใช่ สำหรับ IEEE-754)


การเปรียบเทียบจำนวนเต็มที่ลงนามจะจัดอันดับหมายเลข FP เชิงลบย้อนหลัง สำหรับพวกเขาที่จะจัดอันดับอย่างถูกต้องบางรูปแบบประกอบจะมีความจำเป็นด้วยส่วนเสริมที่อาจจะดีที่สุด (หนึ่งลบจะ ... 110.1111 ... โดยไม่มีที่สิ้นสุดไปทางซ้ายและขวา)
supercat

3
MIL-STD-1750Aอาจเป็นสถาปัตยกรรมตัวประมวลผลที่ใช้กันอย่างแพร่หลายที่สุดซึ่งระบุการแทนจุดลอยตัวที่สมบูรณ์แบบของทั้งสอง ในส่วนที่ 4.1: "ชุดคำสั่งจะต้องสนับสนุนความแม่นยำเดี่ยวจุดคงที่ 16 บิต, ความแม่นยำสองจุดจุดตรึง32 บิต, จุดลอยตัว 32 บิตและจุดลอยตัว 48 บิตขยายข้อมูลความแม่นยำในการแสดงประกอบ 2 " (เหมืองเน้น) .
njuffa

2

IEEE 754 ใช้เครื่องหมาย / ขนาดไม่ใช่ส่วนเติมเต็มหรือสองส่วน

ส่วนประกอบสองอย่างมีข้อเสียที่ช่วงบวกและลบไม่เหมือนกัน หากรูปแบบบิตทั้งหมดใช้ได้แล้วคุณมีหมายเลข x ซึ่งคุณไม่สามารถคำนวณ -x ได้อย่างง่ายดาย เลวร้าย. ทางเลือกคือมีบิตรูปแบบไม่ถูกต้องซึ่งก็ไม่ดีเช่นกัน ใน IEEE 754 ไม่มีรูปแบบบิตที่ไม่ถูกต้องสำหรับจุดลอยตัว 64 หรือ 32 บิตดังนั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับเรื่องนั้น

ส่วนประกอบหนึ่งจะทำให้การคูณ / หารซับซ้อนมากขึ้น (ด้วยขนาดที่เซ็นชื่อคุณแค่ xor สัญญาณและถือว่า mantissa เป็นหมายเลขที่ไม่ได้ลงชื่อ) สำหรับการบวกและลบฉันไม่อยากคิดถึงการบวกและลบในส่วนเติมเต็มของมันทำให้หัวของฉันเจ็บ


วรรคแรกของคำตอบนี้แสดงให้เห็นว่าไม่มีข้อเสียในการลงชื่อ / ขนาด เครื่องหมาย / ขนาดมี +/- 0 และเลขคณิตที่ซับซ้อนกว่าส่วนเติมเต็มของทั้งสอง
Praxeolitic

มี +/- ศูนย์ทั้งปัญหาและคุณสมบัติ ตัวอย่างเช่นการหารจำนวนเล็ก ๆ x ด้วย 10 ^ 100 จะให้ +0 หรือ -0 โดยคงเครื่องหมายของ x ไว้
gnasher729

1

การมีศูนย์ที่เซ็นชื่อจะให้ความหมายที่เพิ่มขึ้นซึ่งอาจเป็นประโยชน์ในการคำนวณเชิงตัวเลข หน้าวิกิพีเดีย ' Signed zero ' พูดว่า:

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

หนึ่งในผู้ออกแบบหลักของจุดลอยตัว IEEE 754 WH Kahanเป็นผู้เสนอของศูนย์ลงนามด้วยเหตุผลเหล่านี้ ความคิดเห็นของเขาน่าจะมีน้ำหนักมาก


1

ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะต้องเข้าใจว่าการคำนวณจุดลอยตัวจะสร้างค่าโดยประมาณไม่ใช่ค่าที่แน่นอน นั่นคือถ้าการคำนวณ floating-point ให้ค่าการเข้ารหัส X ดังนั้นนี่แสดงถึงค่าอุดมคติในทางทฤษฎีซึ่งเกือบจะไม่ใช่ X แน่นอน แต่อยู่ในช่วง [X .. X + e) ​​{โดยที่ 'e' คือ ' machine epsilon 'นั่นคือไม่มีเลขทศนิยมระหว่าง X และ X + e} โดยเฉพาะอย่างยิ่งศูนย์จุดลอยตัวแสดงถึงตัวเลขในอุดมคติซึ่งอาจไม่เป็นศูนย์อย่างแน่นอน แต่มีขนาดเล็กเกินไปที่จะแสดงด้วยค่าการเข้ารหัสจุดลอยตัวที่ไม่ใช่ศูนย์

ระบุว่าการใช้การแสดงสัญลักษณ์ - และ - ขนาดเป็นวิธีที่อนุญาตให้เข้ารหัสเพื่อ 'จดจำ' ว่าค่าอุดมคติในด้านใดของศูนย์คือค่าบวกหรือค่าลบ สิ่งนี้มีความสำคัญอย่างยิ่งในการคำนวณที่ซับซ้อน (ใน 'a + bi' sense) การคำนวณที่ซับซ้อน -> ฟังก์ชันที่ซับซ้อนมักจะมีค่าหลายค่าดังนั้นสำหรับการคำนวณที่เหมาะสมมันเป็นสิ่งสำคัญที่จะต้องใส่ใจกับสถานที่ตั้งของ ศูนย์ที่มีเครื่องหมายแล้วในแง่หนึ่งทำเครื่องหมายที่ตั้งของการตัดสาขาเหล่านี้ - การคำนวณที่ทำในด้านบวกจะแตกต่างจากที่อยู่ทางด้านลบ


1
การคำนวณเลขทศนิยมจะให้ค่าที่แน่นอน มันต่างจากค่าที่ตัวเลขจริงทางคณิตศาสตร์สร้างขึ้นเล็กน้อย หมายเลขจุดลอยตัวแทนตัวเลขหนึ่งไม่ใช่ช่วง
gnasher729

0

รูปแบบจุดลอยตัวส่วนใหญ่ใช้ประโยชน์จากความจริงที่ว่าในระบบเลขฐานสองค่าที่ไม่เป็นศูนย์ใด ๆ ที่มีเลขชี้กำลังไม่น้อยที่สุดจะมี "1" เป็นบิตที่สำคัญที่สุดของ mantissa ดังนั้นในระบบที่มีเขตข้อมูล 23 บิตสำหรับ mantissa mantissas ของตัวเลขบวกจะไม่อยู่ในช่วงตั้งแต่ 0 ถึง 8,388,607 แต่แทนที่จะเป็นจาก 8,388,608 ถึง 16,777,215 mantissas ของตัวเลขที่อาจจะใช่หรือไม่ใช่ช่วงบวกจาก -16,777,215 ถึง -8,388,608 และจาก +8,388,608 ถึง +16,777,215 แม้ว่ารูปแบบตัวเลขสองส่วนนั้นเป็นรูปแบบตัวเลขที่ดีที่สุดเมื่อมีความจำเป็นต้องมีการคำนวณข้ามศูนย์อย่างราบรื่นช่วงค่า mantissa ที่ไม่ต่อเนื่องหมายความว่าการคำนวณจะไม่สามารถทำงานได้อย่างราบรื่นทั่วทั้งศูนย์ไม่ว่าจะใช้ส่วนประกอบสองอย่างหรืออย่างอื่น .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.