นี่คือกุญแจสำคัญที่จะลังเลใจของคุณ: 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
ที่ไม่สามารถเป็นตัวแทนในแต่สามารถในdecimal
double
อย่างไรก็ตามในช่วงที่ทศนิยมสามารถเป็นตัวแทนได้นั้นจะมีความแม่นยำมากกว่าบิตชนิดเนทีฟอื่น ๆ และสามารถแสดงได้โดยไม่มีข้อผิดพลาด
มีบางประเภทที่ลอยอยู่รอบ ๆ มีBigInteger ใน C #ซึ่งสามารถแสดงจำนวนเต็มขนาดใหญ่โดยพลการ มีเทียบเท่ากับของ Java ไม่เป็นBigDecimal (ซึ่งสามารถแสดงตัวเลขขึ้นด้วยตัวเลขทศนิยมถึง 2 32ตัวเลขยาว - ซึ่งเป็นช่วงที่มีขนาดใหญ่) ว่า อย่างไรก็ตามหากคุณแหย่ไปเล็กน้อยคุณสามารถหาการใช้งานแบบรีดด้วยมือ
มีบางภาษาที่มีประเภทของข้อมูลที่มีเหตุผลซึ่งช่วยให้คุณสามารถแสดงถึงการปันส่วนได้อย่างแท้จริง (เพื่อให้ 1/3 นั้นเป็น 1/3 จริง ๆ )
โดยเฉพาะสำหรับ C # และทางเลือกของการลอยหรือเหตุผลฉันจะเลื่อนไปที่ Jon Skeet จากไพน์ลอยทศนิยมใน. NET :
แอปพลิเคชั่นธุรกิจส่วนใหญ่น่าจะใช้ทศนิยมแทนที่จะเป็นทศนิยมหรือสองเท่า กฎง่ายๆของฉันคือค่าที่มนุษย์สร้างขึ้นเช่นสกุลเงินมักจะแสดงด้วยทศนิยมที่ดีกว่า: แนวคิดที่ว่า 1.25 ดอลลาร์มีความสมเหตุสมผลเช่นกัน สำหรับค่าจากโลกธรรมชาติเช่นความยาวและน้ำหนักประเภทจุดลอยตัวไบนารี่จะเหมาะสมกว่า แม้ว่าจะมีทฤษฎี "ที่แน่นอน 1.25 เมตร" แต่มันจะไม่เกิดขึ้นในความเป็นจริง: คุณจะไม่สามารถวัดความยาวได้แน่นอนและพวกมันไม่น่าจะมีอยู่ในระดับอะตอม เราคุ้นเคยกับความอดทน