ทำไมตัวเลขทศนิยมไม่สามารถแสดงในรูปแบบไบนารีได้อย่างแม่นยำ


284

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

สิ่งที่ฉันไม่เข้าใจคือทำไมจากมุมมองทางคณิตศาสตร์ตัวเลขทางด้านขวาของจุดทศนิยมคือ "พิเศษ" ที่อยู่ทางซ้ายหรือไม่

ตัวอย่างเช่นหมายเลข 61.0 มีการแทนค่าไบนารี่ที่แน่นอนเนื่องจากส่วนที่สำคัญของจำนวนใด ๆ นั้นแน่นอนเสมอ แต่หมายเลข 6.10 นั้นไม่ถูกต้อง ทั้งหมดที่ฉันทำคือย้ายทศนิยมหนึ่งตำแหน่งและทันใดนั้นฉันก็ไปจาก Exactopia ไปยัง Inexactville ในทางคณิตศาสตร์ไม่ควรมีความแตกต่างที่แท้จริงระหว่างสองตัวเลข - มันเป็นแค่ตัวเลข

ในทางตรงกันข้ามถ้าฉันย้ายทศนิยมหนึ่งตำแหน่งในทิศทางอื่นเพื่อสร้างหมายเลข 610 ฉันก็ยังอยู่ใน Exactopia ฉันสามารถไปในทิศทางนั้นได้ (6100, 610000000, 610000000000000) และพวกเขายังคงแน่นอนถูกต้องแน่นอน แต่ทันทีที่ทศนิยมผ่านเกณฑ์บางจำนวนจะไม่แน่นอน

เกิดอะไรขึ้น?

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

... 1000  100   10    1   1/10  1/100 ...

ในไบนารีพวกเขาจะเป็น:

... 8    4    2    1    1/2  1/4  1/8 ...

นอกจากนี้ยังไม่มีข้อ จำกัด เกี่ยวกับตัวเลขเหล่านี้ ตำแหน่งจะเพิ่มขึ้นเรื่อย ๆ ไปทางซ้ายและไปทางขวา


2
คุณอาจพบนี้เป็นประโยชน์ที่จะเข้าใจว่าสิ่งที่เกิดขึ้นภายใน nubmber จุดลอย: กายวิภาคของจำนวนจุดลอย
John D. Cook

57
ในเลขฐานสองจำนวน 3 จะแสดงเป็น2¹ + 2 ° = 2 + 1 ที่ดีและง่าย ทีนี้ลองดู 1/3 คุณจะเป็นตัวแทนของสิ่งนั้นอย่างไรโดยใช้พลังลบ 2 ลองทดสอบดูสักหน่อยคุณจะเห็นว่า 1/3 เท่ากับผลรวมของลำดับอนันต์ 2 ^ -2 + 2 ^ -4 + 2 ^ -6 + 2 ^ -8 + ... เช่น ไม่ใช่เรื่องง่ายที่จะเป็นตัวแทนที่แน่นอนในไบนารี
ลาร์ส Haugseth

21
Jon Skeet ตอบคำถามในร่างกายของคุณได้เป็นอย่างดี สิ่งหนึ่งที่ขาดหายไปคือคุณถามคำถามจริงสองคำถาม คำถามไตเติ้ลคือ "ทำไมตัวเลขทศนิยมไม่สามารถแสดงได้อย่างถูกต้องในรูปแบบไบนารี?" คำตอบคือพวกเขาสามารถ ระหว่างชื่อเรื่องและเนื้อหาของคุณคุณทำให้แนวคิดของ "เลขฐานสอง" และแนวคิดของ "การเป็นตัวแทนจุดลอย" จุดลอยตัวเป็นวิธีการแสดงตัวเลขทศนิยมในจำนวนคงที่ของเลขฐานสองที่ค่าใช้จ่ายของความแม่นยำ ไบนารีเป็นเพียงฐานที่แตกต่างกันสำหรับการนับและสามารถแสดงทศนิยมจำนวนเท่าใดก็ได้ตามจำนวนหลักที่ไม่ จำกัด
คริส Blackwell

3
มีหลายระบบที่มีการแทนทศนิยมที่แน่นอน มันใช้งานได้ดีมากเหมือนที่คุณอธิบาย ประเภททศนิยม SQL เป็นหนึ่งในตัวอย่าง ภาษา LISP มีอยู่แล้วภายในมีไลบรารีเชิงพาณิชย์และโอเพนซอร์สมากมายสำหรับการใช้การคำนวณทศนิยมที่แน่นอน เป็นเพียงการที่ไม่มีการสนับสนุนด้านฮาร์ดแวร์สำหรับเรื่องนี้และมีเพียงภาษาและฮาร์ดแวร์ส่วนใหญ่ที่ใช้มาตรฐาน IEEE สำหรับแสดงจำนวนอนันต์ใน 32 หรือ 64 บิต
เลขที่

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

คำตอบ:


360

ตัวเลขทศนิยมสามารถแสดงว่าถ้าคุณมีพื้นที่เพียงพอ - เพียงแค่ไม่ได้โดยลอยไบนารีหมายเลขจุด หากคุณใช้ทศนิยมชนิดทศนิยม (เช่นSystem.Decimalใน. NET) ค่าจำนวนมากที่ไม่สามารถแสดงได้อย่างแน่นอนในเลขทศนิยมจะถูกแสดงอย่างแน่นอน

ลองดูอีกวิธีหนึ่ง - ในฐาน 10 ซึ่งคุณน่าจะคุ้นเคยกับคุณไม่สามารถแสดง 1/3 ได้อย่างแม่นยำ มันคือ 0.3333333 ... (เกิดซ้ำ) เหตุผลที่คุณไม่สามารถแทนค่า 0.1 ได้เพราะเลขฐานสองเป็นเหตุผลเดียวกัน คุณสามารถแทน 3 และ 9 และ 27 ได้ทั้งหมด - แต่ไม่ใช่ 1/3, 1/9 หรือ 1/27

ปัญหาคือ 3 คือจำนวนเฉพาะซึ่งไม่ใช่ตัวประกอบของ 10 นั่นไม่ใช่ปัญหาเมื่อคุณต้องการคูณจำนวนด้วย 3: คุณสามารถคูณด้วยจำนวนเต็มโดยไม่ต้องเจอปัญหาใด ๆ แต่เมื่อคุณหารด้วยจำนวนที่มีความสำคัญและไม่ได้เป็นปัจจัยพื้นฐานของคุณคุณสามารถประสบปัญหา (และจะทำเช่นนั้นหากคุณพยายามหาร 1 ด้วยจำนวนนั้น

แม้ว่าโดยทั่วไปแล้วจะใช้ 0.1 เป็นตัวอย่างที่ง่ายที่สุดของจำนวนทศนิยมที่แน่นอนซึ่งไม่สามารถแสดงได้อย่างแน่นอนในทศนิยมเลขฐานสอง แต่เนื้อหา 0.2 เป็นตัวอย่างที่ง่ายกว่าเนื่องจากมันเป็น 1/5 - และ 5 เป็นนายกที่ทำให้เกิดปัญหาระหว่างทศนิยมและไบนารี .


หมายเหตุด้านข้างเพื่อจัดการกับปัญหาการเป็นตัวแทน จำกัด :

ทศนิยมบางประเภทที่มีขนาดทศนิยมคงที่เหมือนกับขนาดSystem.Decimalอื่น ๆ ที่java.math.BigDecimalมี "ขนาดใหญ่โดยพล" - แต่มันจะมีขีด จำกัด ในบางจุดไม่ว่าจะเป็นหน่วยความจำระบบหรือขนาดสูงสุดตามทฤษฎีของอาร์เรย์ อย่างไรก็ตามนี่เป็นประเด็นที่แยกจากกันโดยสิ้นเชิงกับคำตอบหลักนี้ แม้ว่าคุณจะมีจำนวนอย่างแท้จริงขนาดใหญ่โดยพลการของบิตที่จะเล่นกับคุณยังคงไม่สามารถเป็นตัวแทนของทศนิยม 0.1 ตรงในการแสดงจุดลอยไบนารี เปรียบเทียบกับรอบอื่น ๆ : กำหนดจำนวนทศนิยมโดยพลการคุณสามารถแทนตัวเลขใด ๆ ซึ่งสามารถแทนได้อย่างแน่นอนว่าเป็นจุดไบนารี


8
นั่นเป็นตัวอย่างที่ดีครับ
Tom Ritter

5
... หวังว่าฉันจะโหวตได้สองครั้ง ฉันถูกถามเกี่ยวกับเรื่องนี้หลายครั้งเกินไป เป็นเหมือนคนไม่สามารถคิดนอกฐาน 10 hehe
Justin Niessner

38
ใช่มีคน 10 ชนิดในโลก - คนที่เข้าใจเลขฐานสองและคนที่ไม่เข้าใจ
duffymo

83
@JonSkeet: Ctrl + Alt + Deleteจะดูแปลก ๆ ด้วยสองนิ้ว
ลาร์ส Haugseth

20
@muusbolla: ไม่ตัวเลขแสดงโดยการแทนทศนิยม1และการแทนทศนิยม0.9...(ซ้ำซ้ำไม่สิ้นสุด9หลังจากจุดทศนิยม) มีค่าเท่ากัน บางทีอาจจะเป็นวิธีที่ง่ายที่สุดที่เห็นนี้คือต่อไปนี้: Let x 0.9...= 10x = 9.9....โปรดสังเกตว่า ดังนั้น9x = 10x - x = 9.9... - 0.9... = 9เพื่อให้และ9x = 9 x = 1มีวิธีอื่นในการดูสิ่งนี้ แต่ฉันเชื่อว่านี่เป็นวิธีที่ง่ายที่สุด
เจสัน

25

ตัวอย่างเช่นหมายเลข 61.0 มีการแทนค่าไบนารี่ที่แน่นอนเนื่องจากส่วนที่สำคัญของจำนวนใด ๆ นั้นแน่นอนเสมอ แต่จำนวน 6.10 ไม่ได้เป็นที่แน่นอน ทั้งหมดที่ฉันทำคือย้ายทศนิยมหนึ่งตำแหน่งและทันใดนั้นฉันก็ไปจาก Exactopia ไปยัง Inexactville ศาสตร์ไม่ควรมีความแตกต่างที่แท้จริงระหว่างตัวเลขสอง - พวกเขากำลังเพียงตัวเลข

ลองถอยห่างสักครู่จากรายการฐาน 10 และ 2 ลองถาม - ในฐานbตัวเลขใดที่มีการยกเลิกการเป็นตัวแทนและตัวเลขใดไม่ ความคิดชั่วครู่บอกเราว่าตัวเลขxมีการยกเลิก - การนำเสนอbถ้าหากมีจำนวนเต็มnเช่นนั้นx b^nเป็นจำนวนเต็ม

ตัวอย่างเช่นx = 11/500มีการแทน 10 ครั้งเนื่องจากเราสามารถเลือกn = 3แล้วx b^n = 22จำนวนเต็ม อย่างไรก็ตามx = 1/3ไม่ได้เพราะสิ่งที่nเราเลือกเราจะไม่สามารถกำจัด 3

ตัวอย่างที่สองนี้แจ้งให้เราคิดเกี่ยวกับปัจจัยและเราจะเห็นได้ว่าสำหรับการใด ๆที่มีเหตุผล x = p/q (สันนิษฐานว่าจะเป็นในแง่ต่ำสุด) เราสามารถตอบคำถามโดยการเปรียบเทียบ factorisations สำคัญของและb qหากqมีปัจจัยสำคัญที่ไม่ได้อยู่ในปัจจัยสำคัญของbเราจะไม่สามารถหาที่เหมาะสมnในการกำจัดปัจจัยเหล่านี้

ดังนั้นสำหรับฐาน 10 ที่ใดก็ตาม p/qที่qมีปัจจัยสำคัญนอกเหนือจาก 2 หรือ 5 จะไม่มีการยกเลิกการเป็นตัวแทน

ตอนนี้กลับไปที่ฐาน 10 และ 2 เราจะเห็นว่าเหตุผลใด ๆ ที่มีตัวแทน 10 อันที่สิ้นสุดจะอยู่ในรูปแบบที่p/qแน่นอนเมื่อqมีเพียง2s และ5s ในการแยกตัวประกอบเฉพาะ และหมายเลขเดียวกันนั้นจะมีการบอกเลิก 2 อันแทนเมื่อqมีเท่านั้น2ตัวประกอบที่สำคัญเท่านั้น

แต่หนึ่งในกรณีเหล่านี้คือส่วนย่อยของอีก! เมื่อไรก็ตาม

qมีเพียง2s ใน factorisation เฉพาะ

เห็นได้ชัดว่ามันเป็นยังความจริงที่ว่า

qมีเพียง2s และ5s ในการแยกตัวประกอบเฉพาะ

หรือใส่อีกทางหนึ่งเมื่อใดก็ตามที่p/qมีการยกเลิก 2 แทนp/qมีการยกเลิก 10 อย่างไรก็ตามการสนทนาไม่ได้ถือ - เมื่อใดก็ตามที่qมี 5 ในการแยกตัวประกอบที่สำคัญของมันก็จะมีการยกเลิก 10- ตัวแทน แต่ไม่สิ้นสุดการเป็นตัวแทน 2 นี่คือ0.1ตัวอย่างที่กล่าวถึงโดยคำตอบอื่น ๆ

ดังนั้นเราจึงมีคำตอบให้กับคำถามของคุณ - เนื่องจากปัจจัยสำคัญของ 2 คือชุดย่อยของปัจจัยหลัก 10, หมายเลขที่ลงท้ายด้วย 2 ทั้งหมดนั้นคือ 10 หมายเลขที่ลงท้ายด้วย แต่ไม่ใช่ในทางกลับกัน มันไม่เกี่ยวกับ 61 กับ 6.1 - มันคือประมาณ 10 กับ 2

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


ถ้าอย่างนั้นทำไม "alert (0.15 * 0.15)" display "0.0225"
Michael Geiser

5
@MichaelGeiser คำตอบสั้น ๆ : การปัดเศษที่จุดแสดง สิ่งที่คุณคิดว่าเป็น0.15จริง (เมื่อเก็บไว้เป็นสองเท่าของ IEEE) `0.149999999999999994448884876874` ดูjsfiddle
AakashM

มีความชัดเจนในตัวอย่างรหัสจุด! ฉันหวังว่าฉันจะให้คะแนนคุณได้สำหรับสิ่งนั้น! ฉันต้องเล่นกับฟังก์ชั่นบางอย่างเพื่อสำรวจว่าเกิดการปัดเศษขึ้น ฉันยังคงประหลาดใจที่เราต้องจัดการกับขยะนี้จริง ๆ แล้ว; เนื่องจากคนทำงานในฐานสิบเกือบ 100% ของเวลาและเราใช้ไม่ใช่จำนวนเต็มมากเวลาที่คุณคิดว่าการใช้งานเริ่มต้นของคณิตศาสตร์จุดลอยตัวจะจัดการเรื่องไร้สาระนี้
Michael Geiser

1
@MichaelGeiser วงจรที่ทำงานกับฐาน 2 มีขนาดเล็กลงเร็วขึ้นและประหยัดพลังงานมากกว่าที่ทำงานกับฐาน 10 วันนี้เราอาจจะสามารถพิสูจน์ค่าใช้จ่ายได้ แต่ในปี 1970 เมื่อมาตรฐานถูกตั้งค่ามันเป็น เรื่องใหญ่ การพยายามทำโดยไม่ได้รับการสนับสนุนโดยตรงจากวงจรประมวลผลยิ่งแย่ลงคาดว่าคำสั่งของความแตกต่างของขนาดจะเร็ว
Mark Ransom

คำตอบนี้อธิบายได้ดีกว่า Jon Skeet เอง!
goelakash

16

ราก (คณิตศาสตร์) เหตุผลก็คือว่าเมื่อคุณจะจัดการกับจำนวนเต็มพวกเขาจะไม่มีที่สิ้นสุดวท์

ซึ่งหมายความว่าแม้ว่าจะมีจำนวนไม่ จำกัด เราสามารถ "นับ" รายการทั้งหมดในลำดับโดยไม่ข้ามใด ๆ นั่นหมายความว่าถ้าเราต้องการเอาไอเท็มนั้นไปอยู่ใน610000000000000ตำแหน่งที่สามในรายการเราสามารถหาได้จากสูตร

แต่ตัวเลขจริงมีอนันต์ uncountably คุณไม่สามารถพูดว่า "ให้จำนวนจริงที่ตำแหน่ง610000000000000" และตอบกลับ เหตุผลก็คือแม้ว่าในระหว่าง0และ1มีจำนวนค่าไม่สิ้นสุดเมื่อคุณกำลังพิจารณาค่าจุดลอยตัว เช่นเดียวกันถือเป็นจริงสำหรับสองตัวเลขจุดลอย

ข้อมูลเพิ่มเติม:

http://en.wikipedia.org/wiki/Countable_set

http://en.wikipedia.org/wiki/Uncountable_set

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


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

จริงฉันควรจะพูดว่า "ของจริง" ไม่ใช่ "ทศนิยม" จะชี้แจง
TM

1
ณ จุดนี้ตรรกะจะมีผลบังคับใช้น้อยกว่า IMO - เพราะไม่เพียง แต่เราไม่สามารถจัดการกับจำนวนจริงทั้งหมดโดยใช้เลขทศนิยมแบบไบนารีได้ แต่เราไม่สามารถจัดการกับตัวเลขที่มีเหตุผลทั้งหมด (เช่น 0.1) ในคำอื่น ๆ ผมไม่คิดว่ามันจริงๆจะทำอย่างไรกับ countability ที่ :) ทั้งหมด
จอนสกีต

@ jonskeet ฉันรู้ว่าการไม่เห็นด้วยกับ Jon Skeet จะละเมิดกฎหมายพื้นฐานของธรรมชาติดังนั้นแน่นอนว่าฉันจะไม่ทำมัน :) อย่างไรก็ตามฉันคิดว่ามันโอเคที่จะคิดว่าการเป็นตัวแทนภายในของตัวเลขเป็นดัชนีของ ชุดของค่าที่คุณต้องการเป็นตัวแทนจากภายนอก ด้วยสายการคิดนี้คุณจะเห็นได้ว่าไม่ว่ารายการดัชนีของคุณจะมีขนาดใหญ่เพียงใด (แม้ว่าคุณจะพูดถึงความแม่นยำที่ไม่ จำกัด ) คุณยังคงไม่สามารถแสดงจำนวนจริงทั้งหมดได้
TM

3
@TM: แต่ OP ไม่ได้พยายามแสดงจำนวนจริงทั้งหมด เขาพยายามที่จะเป็นตัวแทนของตัวเลขทศนิยมที่แน่นอนทั้งหมดซึ่งเป็นส่วนย่อยของตัวเลขที่มีเหตุผลและดังนั้นจึงไม่มีที่สิ้นสุดนับ หากเขาใช้บิตจำนวนอนันต์เป็นทศนิยมชนิดทศนิยมเขาจะไม่เป็นไร มันใช้บิตเหล่านั้นเป็นชนิดเลขทศนิยมแบบไบนารีที่ทำให้เกิดปัญหากับตัวเลขทศนิยม
Jon Skeet

10

ในการทำซ้ำสิ่งที่ฉันพูดในความคิดเห็นของฉันกับนาย Skeet: เราสามารถเป็นตัวแทน 1/3, 1/9, 1/27 หรือเหตุผลใด ๆ ในรูปแบบทศนิยม เราทำได้โดยการเพิ่มสัญลักษณ์พิเศษ ตัวอย่างเช่นสายเหนือตัวเลขที่ทำซ้ำในการขยายทศนิยมของตัวเลข สิ่งที่เราต้องแสดงถึงตัวเลขทศนิยมเป็นลำดับของเลขฐานสองคือ1)ลำดับของเลขฐานสอง, 2)จุดฐานและ3)สัญลักษณ์อื่น ๆ เพื่อระบุส่วนที่ซ้ำกันของลำดับ

สัญกรณ์อ้าง Hehner ของเป็นวิธีการทำเช่นนี้ เขาใช้สัญลักษณ์เครื่องหมายคำพูดเพื่อแสดงส่วนที่ซ้ำกันของลำดับ บทความ: http://www.cs.toronto.edu/~hehner/ratno.pdfและรายการวิกิพีเดีย: http://en.wikipedia.org/wiki/Quote_notation

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


ระบบสัญกรณ์นั้นจะทำงานหากเรารู้ว่าวงจรเริ่มต้นและสิ้นสุดที่ใด มนุษย์จะสวยดีที่รอบการตรวจสอบ แต่โดยทั่วไปแล้วคอมพิวเตอร์ไม่ใช่ ในการใช้งานสามารถใช้สัญลักษณ์ซ้ำได้อย่างมีประสิทธิภาพคอมพิวเตอร์จะต้องสามารถคำนวณได้ว่าวัฏจักรอยู่ที่ไหนหลังจากทำการคำนวณ สำหรับหมายเลข 1/3 เช่นรอบจะเริ่มทันที แต่สำหรับหมายเลข 1/97 รอบนั้นจะไม่ปรากฏขึ้นจนกว่าคุณจะได้คำตอบที่อย่างน้อย 96 หลัก (อันที่จริงคุณจะต้อง * 96 2 + 1 = 193 ตัวเลขเพื่อให้แน่ใจว่า.)
แบร์รี่บราวน์

4
จริง ๆ แล้วมันไม่ยากเลยที่คอมพิวเตอร์จะตรวจจับรอบ หากคุณอ่านกระดาษของ Hehner เขาจะอธิบายวิธีตรวจจับรอบสำหรับการคำนวณทางคณิตศาสตร์ต่างๆ ตัวอย่างเช่นในอัลกอริทึมการหารซึ่งใช้การลบซ้ำคุณจะรู้ว่าวงจรเริ่มต้นเมื่อคุณเห็นความแตกต่างที่คุณเคยเห็นมาก่อน
พฤศจิกายน

3
นอกจากนี้คำถามเกี่ยวกับการแสดงตัวเลขอย่างแน่นอน บางครั้งการแสดงที่แน่นอนหมายถึงบิตจำนวนมาก ความงามของเครื่องหมายคำพูดคือ Hehner แสดงให้เห็นว่าโดยเฉลี่ยแล้วมีการประหยัดถึง 31% ในขนาดของการเป็นตัวแทนเมื่อเทียบกับการเป็นตัวแทนความยาวคงที่แบบ 32 บิตมาตรฐาน
พฤศจิกายน

6

BCD - ทศนิยมแบบไบนารี - เป็นตัวแทนที่แน่นอน พวกมันไม่ได้มีประสิทธิภาพในการใช้พื้นที่มากนัก แต่นั่นเป็นข้อเสียที่คุณต้องทำเพื่อความแม่นยำในกรณีนี้


1
BCD ไม่แม่นยำมากไปกว่าฐานอื่น ๆ ตัวอย่าง: คุณเป็นตัวแทน 1/3 ใน BCD ได้อย่างไร คุณทำไม่ได้
Jörg W Mittag

12
BCD เป็นตัวแทนที่แน่นอนของ DECIMAL ดังนั้นส่วน, um, "ทศนิยม" ของชื่อ ไม่มีการแทนทศนิยมที่แน่นอนของ 1/3 เช่นกัน
Alan

4

มันเป็นเหตุผลเดียวกันกับที่คุณไม่สามารถแทน 1/3 ในฐาน 10 คุณต้องบอกว่า 0.33333 (3) ในไบนารีมันเป็นปัญหาประเภทเดียวกัน แต่เพิ่งเกิดขึ้นสำหรับชุดตัวเลขที่แตกต่างกัน


4

(หมายเหตุ: ฉันจะผนวก 'b' เพื่อระบุเลขฐานสองที่นี่ตัวเลขอื่น ๆ ทั้งหมดจะได้รับเป็นทศนิยม)

วิธีหนึ่งที่จะคิดเกี่ยวกับสิ่งต่าง ๆ คือในแง่ของบางอย่างเช่นสัญลักษณ์ทางวิทยาศาสตร์ เราเคยเห็นตัวเลขที่แสดงในรูปแบบทางวิทยาศาสตร์เช่น 6.022141 * 10 ^ 23 หมายเลขทศนิยมจะถูกเก็บไว้ภายในโดยใช้รูปแบบที่คล้ายกัน - mantissa และเลขชี้กำลัง แต่ใช้พลังของสองแทนสิบ

61.0 ของคุณสามารถเขียนใหม่เป็น 1.90625 * 2 ^ 5 หรือ 1.11101b * 2 ^ 101b ด้วย mantissa และ exponents หากต้องการคูณด้วยสิบและ (เลื่อนจุดทศนิยม) เราสามารถทำ:

(1.90625 * 2 ^ 5) * (1.25 * 2 ^ 3) = (2.3828125 * 2 ^ 8) = (1.19140625 * 2 ^ 9)

หรือด้วย mantissa และเลขชี้กำลังในไบนารี:

(1.11101b * 2 ^ 101B) * (1.01b * 2 ^ 11b) = (10.0110001b * 2 ^ 1000b) = (1.00110001b * 2 ^ 1001b)

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

ทีนี้ลองพิจารณาว่าเราแบ่ง 61 ด้วย 10 อย่างไรเราเริ่มด้วยการแบ่งตั๊กแตนตำข้าว, 1.90625 และ 1.25 ในทศนิยมนี้จะให้ 1.525 เป็นจำนวนสั้นที่ดี แต่ถ้าเราแปลงมันเป็นไบนารี่ เราจะทำตามวิธีปกติ - ลบกำลังที่ใหญ่ที่สุดของสองเท่าเมื่อทำได้เท่าที่ทำได้เช่นแปลงทศนิยมจำนวนเต็มเป็นไบนารี่ แต่เราจะใช้พลังลบสองตัว:

1.525 - 1 * 2 ^ 0 -> 1
0.525 - 1 * 2 ^ -1 -> 1
0.025 - 0 * 2 ^ -2 -> 0
0.025 - 0 * 2 ^ -3 -> 0
0.025 - 0 * 2 ^ -4 -> 0
0.025 - 0 * 2 ^ -5 -> 0
0.025 - 1 * 2 ^ -6 -> 1
0.009375 - 1 * 2 ^ -7 -> 1
0.0015625 - 0 * 2 ^ -8 -> 0
0.0015625 - 0 * 2 ^ -9 -> 0
0.0015625 - 1 * 2 ^ -10 -> 1
0.0005859375 - 1 * 2 ^ -11 -> 1
0.00009765625 ...

เอ่อโอ้. ตอนนี้เรากำลังมีปัญหา ปรากฎว่า 1.90625 / 1.25 = 1.525 เป็นเศษส่วนซ้ำเมื่อแสดงเป็นไบนารี่: 1.11101b / 1.01b = 1.10000110011 ... b เครื่องของเรามีบิตจำนวนมากที่จะถือแมนทิสซานั้นและพวกมันจะปัดเศษเศษส่วน และสมมติเลขศูนย์เกินกว่าจุดที่แน่นอน ข้อผิดพลาดที่คุณเห็นเมื่อคุณแบ่ง 61 ด้วย 10 คือความแตกต่างระหว่าง:

1.100001100110011001100110011001100110011 ... b * 2 ^ 10b
และพูดว่า:
1.100001100110011001100110011111111111111111111111111111111

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

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


4

นี่เป็นคำถามที่ดี

คำถามทั้งหมดของคุณขึ้นอยู่กับ "เราจะแสดงหมายเลขได้อย่างไร"

ตัวเลขทั้งหมดสามารถแสดงด้วยทศนิยมแทนหรือด้วยการเป็นตัวแทนไบนารี (2 ของส่วนเสริม) พวกเขาทุกคน !!

แต่บางส่วน (ส่วนใหญ่) ต้องการองค์ประกอบจำนวนอนันต์ ("0" หรือ "1" สำหรับตำแหน่งไบนารีหรือ "0", "1" ถึง "9" สำหรับการแทนทศนิยม)

ชอบ 1/3 แทนทศนิยม (1/3 = 0.3333333 ... <- ด้วยจำนวนอนันต์ของ "3")

เช่นเดียวกับ 0.1 ในไบนารี่ (0.1 = 0.00011001100110011 .... <- ด้วยจำนวนอนันต์ของ "0011")

ทุกอย่างอยู่ในแนวคิดนั้น ตั้งแต่เครื่องคอมพิวเตอร์ของคุณเท่านั้นที่สามารถพิจารณาจำกัดชุดของตัวเลข (ทศนิยมหรือไบนารี), ตัวเลขเพียงบางส่วนสามารถแสดงว่าในเครื่องคอมพิวเตอร์ของคุณ ...

และดังที่ Jon กล่าวไว้ 3 คือจำนวนเฉพาะซึ่งไม่ใช่ตัวประกอบของ 10 ดังนั้น 1/3 ไม่สามารถแสดงด้วยองค์ประกอบจำนวนจำกัดในฐาน 10

แม้จะมีเลขคณิตที่มีความแม่นยำโดยพลการระบบกำหนดตำแหน่งในฐาน 2 ยังไม่สามารถอธิบาย 6.1 ได้อย่างสมบูรณ์แม้ว่ามันจะเป็นตัวแทน 61

สำหรับ 6.1 เราต้องใช้การแทนอื่น (เช่นการแทนทศนิยมหรือ IEEE 854 ที่อนุญาตให้มีฐาน 2 หรือฐาน 10 สำหรับการแสดงค่าทศนิยม)


คุณสามารถแทน 1/3 เป็นเศษส่วนได้ คุณไม่ต้องการบิตจำนวนอนันต์เพื่อเป็นตัวแทน คุณเพียงแค่แสดงว่ามันเป็นเศษส่วน 1/3 แทนที่จะเป็นผลลัพธ์ของการรับ 1 และหารด้วย 3 ระบบหลายระบบทำงานในลักษณะนั้น จากนั้นคุณต้องใช้วิธีการที่เป็นมาตรฐาน / * + - และตัวดำเนินการที่คล้ายกันเพื่อใช้แทนเศษส่วน แต่นั่นง่ายมาก - คุณสามารถดำเนินการเหล่านั้นได้ด้วยปากกาและกระดาษสอนคอมพิวเตอร์ให้ทำได้ไม่ใช่เรื่องใหญ่ .
nos

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

3

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


3

ฉันประหลาดใจที่ไม่มีใครได้กล่าวนี้ยังใช้งาน: ใช้fractions ต่อเนื่อง จำนวนตรรกยะสามารถแทนด้วยเลขฐานสองได้ด้วยวิธีนี้

ตัวอย่างบางส่วน:

1/3 (0.3333 ... )

0; 3

5/9 (0.5555 ... )

0; 1, 1, 4

10/43 (0.232558139534883720930 ... )

0; 4, 3, 3

9093/18478 (0.49209871198181621387596060179673 ... )

0; 2, 31, 7, 8, 5

จากที่นี่มีหลากหลายวิธีในการเก็บลำดับของจำนวนเต็มในหน่วยความจำ

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

เศษส่วนต่อเนื่องของ Pi:

3; 7, 15, 1, 292 ...

การยกเลิกลำดับที่ 1 จะให้เศษส่วน:

355/113

ซึ่งเป็นการประมาณที่ยอดเยี่ยมอย่างมีเหตุผล


แต่คุณจะนำเสนอสิ่งนั้นในรูปแบบไบนารี่ได้อย่างไร? ตัวอย่างเช่น 15 ต้องใช้ 4 บิตในการแสดง แต่ 292 ต้องการ 9. ฮาร์ดแวร์ (หรือซอฟต์แวร์) รู้ได้อย่างไรว่าขอบเขตบิตอยู่ระหว่างกันอย่างไร มันมีประสิทธิภาพเมื่อเทียบกับการแลกเปลี่ยนความแม่นยำ
กระตือรือร้น

2

ในสมการ

2^x = y ;  
x = log(y) / log(2)

ดังนั้นฉันแค่สงสัยว่าเราจะมีระบบฐานลอการิทึมสำหรับไบนารีเช่น

 2^1, 2^0, 2^(log(1/2) / log(2)), 2^(log(1/4) / log(2)), 2^(log(1/8) / log(2)),2^(log(1/16) / log(2)) ........

นั่นอาจจะสามารถแก้ปัญหาได้ดังนั้นหากคุณต้องการเขียนบางอย่างเช่น 32.41 ในไบนารี่นั่นก็คือ

2^5 + 2^(log(0.4) / log(2)) + 2^(log(0.01) / log(2))

หรือ

2^5 + 2^(log(0.41) / log(2))

1

ปัญหาคือคุณไม่รู้จริง ๆ ว่าจำนวนนั้นเป็น 61.0 จริงหรือไม่ พิจารณาสิ่งนี้:


float a = 60;
float b = 0.1;
float c = a + b * 10;

ค่าของ c คืออะไร? ไม่ตรงกับ 61 เพราะ b ไม่ใช่ .1 จริงๆเพราะ. 1 ไม่มีการแทนค่าฐานสองที่แน่นอน


1

มีขีด จำกัด เนื่องจากความหมายของตัวเลขหายไปจากจำนวนเต็มเป็นไม่ใช่จำนวนเต็ม เพื่อเป็นตัวแทน 61 คุณมี 6 * 10 ^ 1 + 1 * 10 ^ 0; 10 ^ 1 และ 10 ^ 0 เป็นจำนวนเต็มทั้งคู่ 6.1 คือ 6 * 10 ^ 0 + 1 * 10 ^ -1 แต่ 10 ^ -1 คือ 1/10 ซึ่งไม่ใช่จำนวนเต็มแน่นอน นั่นคือวิธีที่คุณจะลงเอยใน Inexactville


1

เส้นขนานสามารถทำจากเศษส่วนและจำนวนเต็ม เศษส่วนบางส่วนเช่น 1/7 ไม่สามารถแสดงในรูปแบบทศนิยมโดยไม่มีล็อตและทศนิยมมากมาย เนื่องจากเลขทศนิยมเป็นแบบฐานสองกรณีพิเศษจึงเปลี่ยน แต่ปัญหาความแม่นยำแบบเดียวกันก็มีอยู่


0

มีจำนวนตรรกยะจำนวน จำกัด และจำนวน จำกัด บิตที่จะเป็นตัวแทนของพวกเขา ดูhttp://en.wikipedia.org/wiki/Floating_point#Accuracy_problems


แต่ถึงแม้ว่าจะมีจำนวนบิตไม่สิ้นสุดหากคุณใช้จุดไบนารี่แบบลอยตัวคุณก็ยังคงไม่สามารถแสดงถึง 0.1 ได้เหมือนว่าคุณไม่สามารถแทนค่าทศนิยม 1/3 ได้แม้จะมีจำนวนบิตไม่ จำกัด
Jon Skeet

3
@ จอนนั่นไม่จริง: ด้วยจำนวนทศนิยมที่ไม่มีที่สิ้นสุดฉันสามารถยกตัวอย่างเช่นแสดง 'หนึ่งในสาม' ว่า ปัญหาในโลกแห่งความเป็นจริงนั้นเป็นไปไม่ได้ที่จะมี "จำนวนอนันต์" ของทศนิยมหรือบิต
ChrisW

0

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

มันง่ายกว่ามากที่จะไปให้ถึงจุดประมาณทางด้านขวาของจุดทศนิยม ถ้าคุณเริ่มเขียนตัวเลขทั้งหมดในทศนิยมเลขฐานสองมันน่าจะสมเหตุสมผลมากกว่า

วิธีคิดอีกอย่างคือเมื่อคุณสังเกตว่า 61.0 สามารถแสดงได้อย่างสมบูรณ์ในฐาน 10 และการเลื่อนจุดทศนิยมไปมาไม่เปลี่ยนคุณกำลังทำการคูณด้วยกำลังสิบ (10 ^ 1, 10 ^ -1 ) ในจุดลอยการคูณด้วยกำลังสองไม่ส่งผลต่อความแม่นยำของตัวเลข ลองถ่าย 61.0 แล้วหารด้วยสามซ้ำ ๆ กันเพื่อดูว่าจำนวนที่แม่นยำที่สุดจะสูญเสียการแสดงที่แม่นยำได้อย่างไร


0

คุณรู้จำนวนเต็มใช่ไหม แต่ละบิตแทน 2 ^ n


2 ^ 4 = 16
2 ^ 3 = 8
2 ^ 2 = 4
2 ^ 1 = 2
2 ^ 0 = 1

มันเหมือนกันสำหรับจุดลอย (มีความแตกต่าง) แต่บิตเป็นตัวแทน 2 ^ -n 2 ^ -1 = 1/2 = 0.5
2 ^ -2 = 1 / (2 * 2) = 0.25
2 ^ -3 = 0.125
2 ^ -4 = 0.0625

เลขทศนิยมแทนทศนิยม:

เครื่องหมายเศษส่วนแบบเลขชี้กำลัง (ฉันคิดว่ามองไม่เห็น 1 ถูกผนวกเข้ากับเศษส่วน)
B11 B10 B9 B8 B7 B6 B5 B4 B4 B3 B2 B1 B0


0

คำตอบที่ให้คะแนนสูงเหนือตอกมัน

ก่อนอื่นคุณผสมเบส 2 และเบส 10 ในคำถามของคุณจากนั้นเมื่อคุณใส่ตัวเลขทางด้านขวาที่ไม่สามารถหารลงในฐานได้คุณจะพบปัญหา เช่น 1/3 ในทศนิยมเพราะ 3 ไม่ได้เป็นกำลังของ 10 หรือ 1/5 ในไบนารี่ซึ่งไม่ได้เป็นกำลังของ 2

ความคิดเห็นอื่นแม้ว่าจะไม่ใช้เท่ากับตัวเลขทศนิยมระยะเวลา แม้ว่ามันจะเป็นตัวแทนที่แน่นอน แต่ก็มีบางตัวเลขในระบบจุดลอยตัวบางอย่างที่สามารถแสดงได้อย่างแม่นยำมากกว่าหนึ่งวิธี (IEEE ไม่ดีเกี่ยวกับเรื่องนี้มันเป็นจุดลอยตัวสเป็คที่น่ากลัวเริ่มต้นด้วย ไม่แตกต่างกันที่นี่ 1/3 ไม่เท่ากับจำนวนในเครื่องคิดเลขของคุณ 0.3333333 ไม่ว่าจำนวนของ 3 จะอยู่ทางขวาของจุดทศนิยม มันเป็นหรือสามารถใกล้พอ แต่ไม่เท่ากัน ดังนั้นคุณคาดหวังบางอย่างเช่น 2 * 1/3 ไม่เท่ากับ 2/3 ขึ้นอยู่กับการปัดเศษ อย่าใช้เท่ากันกับจุดลอย


0

ในขณะที่เรากำลังพูดถึงในทศนิยมเลขทศนิยม 0.1 ไม่สามารถแสดงได้อย่างสมบูรณ์แบบในไบนารี

การแสดงจำนวนจุดลอยตัวและจำนวนเต็มจัดให้มีกริดหรือโปรยสำหรับตัวเลขที่แสดง เมื่อคำนวณเสร็จแล้วผลลัพธ์จะหลุดออกจากกริดและจะต้องใส่กลับเข้าไปในกริดโดยการปัดเศษ ตัวอย่างคือ 1/10 บนกริดไบนารี

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


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