มีตัวเลขที่ไม่สามารถแทนได้ในฐาน 10 แต่สามารถแสดงในฐาน 2 ได้หรือไม่


42

C#มีdecimalประเภทที่ใช้สำหรับตัวเลขที่ต้องการการแทนค่าที่แน่นอนในฐาน 10 ตัวอย่างเช่น0.1ไม่สามารถแสดงในฐาน 2 (เช่นfloatและdouble) และจะเป็นการประมาณเสมอเมื่อเก็บไว้ในตัวแปรที่เป็นประเภทเหล่านี้

ฉันสงสัยว่าข้อเท็จจริงที่ตรงกันข้ามนั้นเป็นไปได้หรือไม่ มีตัวเลขที่ไม่สามารถแทนได้ในฐาน 10 แต่สามารถแสดงในฐาน 2 (ในกรณีนี้ฉันต้องการใช้ a floatแทน a decimalเพื่อจัดการกับมัน) หรือไม่?


14
+1 กับคำถาม แต่แท็กc #ใช้ได้จริงหรือไม่ ภาษาอื่นมีประเภททศนิยมเช่นกัน
Patrick M

1
@ Max: ในการออกกำลังกายฉันแนะนำให้คุณจินตนาการถึงการแปลงเลขฐาน 2 เป็นฐาน 10 ด้วยมือ เช่นในการคำนวณค่าของการเขียนมันออกมาเป็น0.11_b2 0.5 + 0.5 * 0.5มีขั้นตอนใดบ้างที่อาจล้มเหลวหรือส่งผลให้เกิดทศนิยมซ้ำ โดยส่วนตัวแล้วฉันพบว่าแบบฝึกหัดนี้เป็นงานที่ยอดเยี่ยมที่ได้รับสัญชาติญาณเกี่ยวกับตัวเลข 2 ฐาน ฉันคิดว่าใครจะไปอีกขั้นและเปลี่ยนแบบฝึกหัดนี้เป็นหลักฐานโดยการสร้าง
Brian

อ่า แต่คุณผิด 1/1010
ซาเวียร์ J

3
@Ramhound จากข้อ จำกัด ของหน่วยความจำไบนารีสามารถแสดงได้0.0999999....998..อย่างแม่นยำ แต่ไม่ใช่ตัวเลขเต็ม0.1- การประมาณเช่นการปัดเศษไปยัง hundreth ที่ใกล้ที่สุดด้วย0.100ความกังวลเกี่ยวกับการติดตั้งที่ไม่แสดงตัวเลขทั้งหมดและปัดเศษแทน
Izkata

1
มันเป็นไปได้ที่จะเกิดขึ้นกับกลไกการเข้ารหัส FP ที่อนุญาตให้ '0.1' ถูกแทนอย่างแน่นอน การเข้ารหัสดังกล่าวจะเลื่อนไปรอบ ๆ ชุดของช่วงหมายเลข FP มากกว่าที่จะทำได้และไม่สามารถแสดงได้
Martin James

คำตอบ:


104

นี่คือกุญแจสำคัญที่จะลังเลใจของคุณ: 10เป็นผลิตภัณฑ์ของและ2 5คุณสามารถแทนจำนวนใด ๆ ตรงฐาน 10 ทศนิยมที่เป็น k * 1/2 n * 1/5 ม.ที่k, nและmเป็นจำนวนเต็ม

อีกนัยหนึ่งคือถ้าตัวเลขnใน 1 / n ประกอบด้วยปัจจัยที่ไม่ได้เป็นส่วนหนึ่งของปัจจัยฐานจะไม่สามารถแสดงตัวเลขที่แน่นอนในจำนวนคงที่ของตัวเลขในไบนารี / ทศนิยม / การขยายตัวใด ๆ ก็ตาม หมายเลข - มันจะมีส่วนที่ซ้ำกัน ตัวอย่างเช่น 1/15 = 0.0666666666 .... เนื่องจาก 3 (15 = 3 * 5) ไม่ใช่ตัวประกอบของ 10

ดังนั้นสิ่งที่สามารถแสดงในฐาน 2 ได้อย่างแน่นอน (k * 1/2 n ) สามารถแสดงในฐาน 10 ได้อย่างแน่นอน

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


ในเลขฐานสองจำนวน 1/10 ซึ่งเป็นทศนิยม 0.1 อย่างสะดวกไม่สามารถแสดงเป็นจำนวนที่สามารถแสดงเป็นจำนวนบิตคงที่ในเลขฐานสอง แต่ตัวเลขคือ 0.00011001100110011 ... 2 (ด้วยส่วน 0011 ซ้ำตลอดไป)

ให้ดูที่หมายเลข 1 2 /1010 2บิตใกล้ชิดมากขึ้น

          ____                  
       0.00011                  
     + ---------                 
1010 | 1.00000                  
       0                        
       -                       
       1 0                      
         0                      
       ----                     
       1 00 --------- +          
          0 |          
       ----- |          
       1 000 |          
           0 |          
       ------ | การทำซ้ำ
       1 0000 | บล็อก    
         1010 |          
       ------ |          
          1100 |          
          1010 |          
          ---- |          
            100 ---- +          

นี่คือสิ่งเดียวกันกับที่คุณได้รับเมื่อคุณพยายามแบ่งให้ยาวเป็น 1/3

1/10 เมื่อแยกเป็น 1 / (2 1 * 5 1 ) สำหรับฐาน 10 (หรือหลาย ๆ 10) ตัวเลขนี้ยุติและเป็นที่รู้จักกันเป็นจำนวนปกติ การขยายทศนิยมที่ซ้ำจะเรียกว่าทศนิยมซ้ำและตัวเลขเหล่านั้นที่ดำเนินต่อไปโดยไม่ต้องทำซ้ำเป็นตัวเลขที่ไม่มีเหตุผล

คณิตศาสตร์ที่อยู่เบื้องหลังนี้ขุดคุ้ยทฤษฎีบทเล็ก ๆ น้อย ๆ ของแฟร์มาต์ ... และเมื่อคุณเริ่มต้นบอกว่าแฟร์มาต์หรือทฤษฎีบทมันจะกลายเป็นคำถาม Math.SE

มีตัวเลขที่ไม่สามารถแทนได้ในฐาน 10 แต่สามารถแสดงในฐาน 2 ได้หรือไม่

คำตอบคือ 'ไม่'

ดังนั้น ณ จุดนี้เราทุกคนควรมีความชัดเจนว่าทุกการขยายตัวแบบไบนารีความยาวคงที่ของจำนวนตรรกยะสามารถแสดงเป็นการขยายทศนิยมความยาวคงที่


ให้ดูทศนิยมใน C # อย่างใกล้ชิดซึ่งนำเราไปสู่ทศนิยมทศนิยมใน. NETและให้ผู้เขียนฉันจะยอมรับว่ามันทำงานอย่างไร

ชนิดทศนิยมมีส่วนประกอบเหมือนกับเลขทศนิยมอื่น ๆ : mantissa, exponent และเครื่องหมาย ตามปกติสัญญาณเป็นเพียงบิตเดียว แต่มี 96 บิตของแมนทิสซาและ 5 บิตของเลขชี้กำลัง อย่างไรก็ตามชุดค่าผสมเลขชี้กำลังทั้งหมดไม่ถูกต้อง เฉพาะค่า 0-28 การทำงานและพวกเขาได้อย่างมีประสิทธิภาพในเชิงลบทั้งหมด: ค่าตัวเลขเป็น วิธีนี้สูงสุดและต่ำสุดค่าชนิดที่มี +/- (2 96 -1) และหมายเลขที่เล็กที่สุดที่ไม่ใช่ศูนย์ในแง่ของขนาดที่แน่นอนคือ 10 -28sign * mantissa / 10exponent

ฉันจะชี้ให้เห็นทันทีว่าเนื่องจากการใช้งานนี้มีตัวเลขในdoubleประเภทที่ไม่สามารถแสดงได้decimal- ตัวเลขที่อยู่นอกช่วง Double.Epsilonคือการ4.94065645841247e-324ที่ไม่สามารถเป็นตัวแทนในแต่สามารถในdecimaldouble

อย่างไรก็ตามในช่วงที่ทศนิยมสามารถเป็นตัวแทนได้นั้นจะมีความแม่นยำมากกว่าบิตชนิดเนทีฟอื่น ๆ และสามารถแสดงได้โดยไม่มีข้อผิดพลาด

มีบางประเภทที่ลอยอยู่รอบ ๆ มีBigInteger ใน C #ซึ่งสามารถแสดงจำนวนเต็มขนาดใหญ่โดยพลการ มีเทียบเท่ากับของ Java ไม่เป็นBigDecimal (ซึ่งสามารถแสดงตัวเลขขึ้นด้วยตัวเลขทศนิยมถึง 2 32ตัวเลขยาว - ซึ่งเป็นช่วงที่มีขนาดใหญ่) ว่า อย่างไรก็ตามหากคุณแหย่ไปเล็กน้อยคุณสามารถหาการใช้งานแบบรีดด้วยมือ

มีบางภาษาที่มีประเภทของข้อมูลที่มีเหตุผลซึ่งช่วยให้คุณสามารถแสดงถึงการปันส่วนได้อย่างแท้จริง (เพื่อให้ 1/3 นั้นเป็น 1/3 จริง ๆ )


โดยเฉพาะสำหรับ C # และทางเลือกของการลอยหรือเหตุผลฉันจะเลื่อนไปที่ Jon Skeet จากไพน์ลอยทศนิยมใน. NET :

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


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

@Doval ฉันสงสัยว่ามีข้อผิดพลาดในการให้เหตุผลหรือคำอธิบายของฉันว่าคนที่มุ่งเน้นทางคณิตศาสตร์มากขึ้นสามารถชี้ให้เห็น ... แต่ฉันคิดว่าฉันกำลังถูกทางถ้าเป็นกรณีนี้

"ค่อนข้างสำคัญ" ในกรณีนี้หมายถึง "ไม่ใช่ปัจจัย" ใช่ไหม? มีความสัมพันธ์ทางคณิตศาสตร์ที่ลึกซึ้งยิ่งขึ้นที่ฉันหายไปไหม?
Patrick M

1
อาดังนั้นฉันเข้าใจแล้วn = 15และb = 10ไม่ได้เป็นนายกที่ดี ("ไม่มีปัจจัยบวกร่วม (ตัวหาร) ยกเว้น 1") เพราะพวกเขาแบ่งปัน 5 เป็นปัจจัย กุญแจสำคัญคือไม่ใช่ว่าทุกปัจจัยของ 15 (5 และ 3) ไม่ใช่ปัจจัย 10 (นอกเหนือจาก: มีคำที่ระบุตัวเลขที่ทำหรือไม่เปิดเผยปัจจัยทั่วไปทั้งหมดหรือไม่) ฉันคิดว่ามันเป็นระเบียบเรียบร้อย สรุปในk, n, mสมการของคุณแต่การคาดศีรษะของฉันไว้รอบ ๆ ฉันจะต้องเห็นพล็อต 3 มิติ ไม่ว่าคุณสมควรได้รับ +1 อย่างดี
Patrick M

1
@PatrickM: "นอกเหนือจาก: มีคำที่ระบุตัวเลขที่ทำหรือไม่แชร์ปัจจัยทั่วไปทั้งหมดหรือไม่?": จำนวนเต็มใด ๆ เป็นปัจจัยของตัวเองดังนั้นหากปัจจัยทั้งหมดของmเป็นปัจจัยของnก็จะตามมาเล็กน้อยเมตรเป็นปัจจัยของn หนึ่งคำนี้ที่คุณรู้ได้อย่างชัดเจนเป็นปัจจัย ก็คือตัวหาร
ruakh

6

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

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

ความแม่นยำ: 28-29 หลักสำคัญ

1ขอบคุณ MichaelT ที่เตือนฉันถึงหมายเลขที่ไม่มีเหตุผลอื่น


2
@Magus พิจารณาตัวเลขที่ไม่มีเหตุผลe(2.71 ... ) บันทึกธรรมชาติ - ln (x) คือฐานบันทึก e ดังนั้นฐานที่ไม่มีเหตุผลจึงมีอยู่และเป็นประโยชน์ ประโยชน์เฉพาะของ base pi ฉันไม่แน่ใจ - แต่นั่นไม่ได้หมายความว่าไม่ได้ใช้งานที่ไหนซักแห่ง

6
@ Max คุณกำลังพลัดพรากจากคำถามทางคณิตศาสตร์มากขึ้นเรื่อย ๆ คุณอาจพบว่าถ้าจำนวนไม่มีเหตุผลในฐาน 10 มันไม่ลงตัวในฐานอื่นหรือไม่? เพื่อเป็นประโยชน์ในการอ่านและเป็นจุดเริ่มต้นสำหรับคำถามเชิงทฤษฎีเชิงตัวเลขเพิ่มเติม

2
1/3 ไม่สมเหตุสมผล
Adam Zuckerman

2
OP ถามเกี่ยวกับฐาน 10 (สิบ) การสร้างระบบฐานของสิ่งใดจะทำให้คุณสามารถแสดงสิ่งใดเป็น 10 ตามบทความ Wikipedia การใช้หมายเลขที่ไม่มีเหตุผลในฐานะที่เป็นฐานไม่ได้ทำให้เกิดเหตุผล จำนวนตรรกยะสามารถแสดงเป็นจำนวนเต็มสำหรับตัวเศษและตัวส่วน, ตัวเลขที่ซ้ำกันในทศนิยมหรือการสิ้นสุดแบบ จำกัด ของตัวเลขในทศนิยม
Adam Zuckerman

5
@FrustratedWithFormsDesigner ความไร้เหตุผลไม่มีอะไรเกี่ยวข้องกับฐาน นั่นมันเป็นการกล่าวเกินจริง แต่มันไร้เหตุผลที่มีความหมายสำหรับการแทนตัวเลขในฐานต่าง ๆ (เช่นมีตัวเลขไม่ซ้ำที่ไม่สิ้นสุด) ไม่ใช่วิธีอื่น ๆ อ่านคำถาม math.se ที่เชื่อมโยงกับด้านบน: math.stackexchange.com/questions/625473/…

1

ประเภททศนิยมสองฐานจะสามารถแสดงค่าได้อย่างแม่นยำซึ่งประเภทฐานสิบที่มีขนาดเดียวกันไม่สามารถทำได้ ค่าใด ๆ ที่จะสามารถแสดงได้อย่างแน่นอนโดยชนิดฐาน -2 บางขนาดจะสามารถแทนได้อย่างแน่นอนในประเภทฐานสิบที่มีขนาดเพียงพอ ขนาดที่จำเป็นสำหรับประเภทฐานสิบล้วนเพื่อแสดงค่าทั้งหมดของเลขทศนิยมเลขฐานสองจะขึ้นอยู่กับช่วงเลขชี้กำลังของประเภทไบนารี; หลายร้อยบิตสำหรับหรือพันสำหรับfloatdouble

ที่ได้รับการกล่าวว่าDecimalประเภทมีขนาดใหญ่พอที่จะเป็นไปได้ที่จะทำให้สามารถใช้งานได้ในรูปแบบ "สากล" ที่มีความสามารถในการเก็บค่าของตัวเลขดั้งเดิมอื่น ๆ และให้คุณสมบัติเพิ่มเติมอื่น ๆ นอกเหนือจากนี้ เพื่อระบุว่าค่าที่เก็บไว้เป็นผลมาจากการแปลง a doubleหรือไม่และหากมีการตั้งค่าบิตนั้นให้ใช้ 64 บิตเพื่อเก็บค่าที่เป็นปัญหา) อย่างไรก็ตาม Microsoft เลือกที่จะไม่ทำเช่นนั้น ดังนั้นการแปลง a doubleถึงDecimalจะล้มเหลวอย่างสมบูรณ์สำหรับค่าขนาดใหญ่จะทำให้ค่าเล็ก ๆ ถูกปัดเศษเป็น 1E-28 ที่ใกล้ที่สุด เพิ่มเติมแม้ในช่วงไดนามิกของdecimalวิธีการแปลงจะไม่ "ไปกลับ" ตัวอย่างเช่นการประเมินค่า 1.0 / 3.0 เป็น double จะให้ผลตอบแทน 0.33333333333333148 แต่การแปลงเป็นทศนิยมจะให้ผลตอบแทน 0.333333333333333m และการแปลงกลับไปเป็น double จะได้ผลลัพธ์ 0.33333333333329818

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