Có những con số không thể biểu diễn trong cơ sở 10 nhưng có thể được biểu diễn trong cơ sở 2 không?


42

C#decimalloại được sử dụng cho các số cần biểu diễn chính xác trong cơ sở 10. Chẳng hạn, 0.1không thể được biểu diễn trong cơ sở 2 (ví dụ floatdouble) và sẽ luôn là một xấp xỉ khi được lưu trữ trong các biến thuộc các loại này.

Tôi đã tự hỏi nếu thực tế đảo ngược cũng có thể. Có những con số không thể biểu diễn trong cơ sở 10 nhưng có thể được biểu thị trong cơ sở 2 (trong trường hợp này tôi muốn sử dụng floatthay vì a decimalđể xử lý chúng)?


14
+1 cho câu hỏi, nhưng thẻ c # có thực sự áp dụng ở đây không? Các ngôn ngữ khác có loại thập phân là tốt.
Patrick M

1
@Max: Là một bài tập, tôi khuyên bạn nên tưởng tượng chuyển đổi số 2 cơ sở thành số 10 bằng tay. Ví dụ, để tính giá trị của 0.11_b2, hãy viết nó ra 0.5 + 0.5 * 0.5. Có bước nào có thể thất bại hoặc dẫn đến một số thập phân lặp lại không? Cá nhân, tôi thấy rằng bài tập này thực hiện một công việc tuyệt vời thông qua một trực giác về 2 số cơ sở. Tôi cho rằng người ta có thể tiến thêm một bước và biến bài tập này thành một bằng chứng bằng cách xây dựng.
Brian

À, nhưng bạn sai rồi. 1/1010
Xavier J

3
@Ramhound Với các giới hạn bộ nhớ, nhị phân có thể biểu thị 0.0999999....998..chính xác, nhưng không phải là số đầy đủ 0.1- các phép tính gần đúng như làm tròn đến hundreth gần nhất với 0.100một mối quan tâm thực hiện liên quan đến việc không hiển thị cho bạn tất cả các chữ số và làm tròn nó.
Izkata

1
Chà, có thể đưa ra một cơ chế mã hóa FP cho phép '0,1' được thể hiện chính xác. Một mã hóa như vậy chỉ đơn thuần là thay đổi xung quanh các tập hợp phạm vi số FP hơn mức có thể và không thể được biểu diễn.
Martin James

Câu trả lời:


104

Đây là chìa khóa cho tình trạng khó khăn của bạn: 10là sản phẩm của 25. Bạn có thể đại diện cho bất kỳ số lượng chính xác trong cơ sở 10 số thập phân đó là k * 1/2 n * 1/5 m nơi k, nmlà số nguyên.

Các cụm từ khác - nếu số ntrong 1 / n chứa một yếu tố không phải là một phần của các yếu tố của cơ sở, thì số đó sẽ không thể được biểu diễn chính xác trong một số chữ số cố định trong nhị phân / thập phân / bất kỳ sự mở rộng nào của số đó số - nó sẽ có một phần lặp lại. Ví dụ 1/15 = 0,0666666666 .... vì 3 (15 = 3 * 5) không phải là hệ số 10.

Do đó, bất cứ điều gì có thể được biểu diễn trong cơ sở 2 chính xác (k * 1/2 n ) đều có thể được biểu diễn chính xác trong cơ sở 10.

Ngoài ra, vấn đề là bạn đang sử dụng bao nhiêu chữ số / bit để thể hiện số đó. Có một số số có thể được biểu diễn chính xác trong một số cơ sở, nhưng phải mất nhiều hơn một số chữ số / bit để làm.


Trong nhị phân, số 1/10 thuận tiện là 0,1 trong số thập phân không thể được biểu diễn dưới dạng số có thể được biểu diễn trong một số bit cố định trong nhị phân. Thay vào đó, số là 0,00011001100110011 ... 2 (với phần 0011 lặp lại mãi mãi).

Hãy nhìn vào các số 1 2 /1010 2 một chút chặt chẽ hơn.

          ____                  
       0,00011                  
     + ---------                 
1010 | 1,00000                  
       0                        
       -                       
       1 0                      
         0                      
       ----                     
       1 00 --------- +          
          0 |          
       ----- |          
       1 000 |          
           0 |          
       ------ | lặp lại
       1 0000 | khối    
         1010 |          
       ------ |          
          1100 |          
          1010 |          
          ---- |          
            100 ---- +          

Đây chính xác là cùng một loại điều bạn nhận được khi bạn cố gắng thực hiện phép chia dài cho 1/3.

1/10, khi bao thanh toán là 1 / (2 1 * 5 1 ). Đối với cơ sở 10 (hoặc bất kỳ bội số nào của 10), số này chấm dứt và được gọi là số thông thường . Một phần mở rộng thập phân lặp lại được gọi là số thập phân lặp lại và những số đó cứ tiếp tục mà không lặp lại là những số vô tỷ.

Các toán học đằng sau này đào sâu vào định lý nhỏ Fermat ... và một khi bạn bắt đầu nói Fermat hoặc định lý, nó trở thành một câu hỏi Math.SE .

Có những con số không thể biểu diễn trong cơ sở 10 nhưng có thể được biểu diễn trong cơ sở 2 không?

Câu trả lời là không'.

Vì vậy, tại thời điểm này, tất cả chúng ta nên rõ ràng rằng mọi mở rộng nhị phân có độ dài cố định của một số hữu tỷ có thể được biểu diễn dưới dạng mở rộng thập phân có độ dài cố định.


Hãy xem xét kỹ hơn số thập phân trong C # dẫn chúng ta đến điểm nổi thập phân trong .NET và đưa ra cho tác giả, tôi sẽ chấp nhận rằng đó là cách nó hoạt động.

Kiểu thập phân có các thành phần giống như bất kỳ số dấu phẩy động nào khác: mantissa, số mũ và dấu. Như thường lệ, dấu hiệu chỉ là một bit đơn, nhưng có 96 bit mantissa và 5 bit lũy thừa. Tuy nhiên, không phải tất cả các kết hợp số mũ đều hợp lệ. Chỉ các giá trị 0-28 hoạt động và tất cả chúng đều có giá trị âm: giá trị số là . Điều này có nghĩa là các giá trị tối đa và tối thiểu của loại là +/- (2 96 -1) và số khác không nhỏ nhất về độ lớn tuyệt đối là 10 -28 .sign * mantissa / 10exponent

Tôi sẽ chỉ ra ngay rằng vì việc triển khai này có những con số thuộc doubleloại không thể được đại diện trong decimal- những con số nằm ngoài phạm vi. Double.Epsilon4.94065645841247e-324không thể được đại diện trong một decimal, nhưng có thể trong một double.

Tuy nhiên, trong phạm vi mà số thập phân có thể biểu thị, nó có nhiều bit chính xác hơn các loại gốc khác và có thể biểu diễn chúng mà không có lỗi.

Có một số loại khác trôi nổi xung quanh. Có một BigInteger trong C # có thể biểu thị một số nguyên lớn tùy ý. Không có tương đương với BigDecimal của Java (có thể biểu thị các số có chữ số thập phân dài tối đa 2 32 chữ số - chính xác là một phạm vi khá lớn) . Tuy nhiên, nếu bạn chọc ngoáy một chút, bạn có thể tìm thấy các triển khai cuộn bằng tay.

Có một số ngôn ngữ cũng có kiểu dữ liệu hợp lý cho phép bạn biểu diễn chính xác các tỷ lệ hợp lý (sao cho 1/3 thực sự là 1/3).


Đặc biệt cho C # và lựa chọn float hay hợp lý, tôi sẽ trì hoãn Jon Skeet từ pint nổi Decimal trong .NET :

Hầu hết các ứng dụng kinh doanh có lẽ nên sử dụng số thập phân thay vì float hoặc double. Nguyên tắc cơ bản của tôi là các giá trị nhân tạo như tiền tệ thường được biểu thị tốt hơn với dấu phẩy động thập phân: ví dụ, khái niệm chính xác là 1,25 đô la là hoàn toàn hợp lý. Đối với các giá trị từ thế giới tự nhiên, chẳng hạn như độ dài và trọng lượng, các loại dấu phẩy động nhị phân có ý nghĩa hơn. Mặc dù có một lý thuyết "chính xác là 1,25 mét" nhưng điều đó sẽ không bao giờ xảy ra trong thực tế: bạn chắc chắn sẽ không bao giờ có thể đo được độ dài chính xác, và chúng thậm chí không tồn tại ở cấp độ nguyên tử. Chúng ta đã quen với việc có một sự khoan dung nhất định liên quan.


+1 cho một lời giải thích toán học rõ ràng và súc tích. Và để trả lời phiên bản chung hơn của câu hỏi được đặt ra trong tiêu đề, một ví dụ về một số không thể biểu thị trong cơ sở 10 là 1/3.
Doval

@Doval Tôi nghi ngờ có một trục trặc trong lý luận hoặc giải thích của tôi rằng một người thiên về toán học hơn có thể chỉ ra ... nhưng tôi nghĩ tôi đang đi đúng hướng nếu đó là trường hợp.

"Tương đối nguyên tố" trong trường hợp này chỉ có nghĩa là "không phải là một yếu tố của", phải không? Có một số mối quan hệ toán học sâu sắc hơn tôi đang thiếu?
Patrick M

1
À, vì vậy theo tôi hiểu, n = 15b = 10không tương đối chính ("không chia sẻ các yếu tố tích cực chung (ước số) trừ 1") vì chúng chia sẻ 5 là một yếu tố. Điều quan trọng là không phải tất cả các yếu tố của 15 (5 3) cũng không phải là các yếu tố của 10. (Ngoài ra: có một từ để chỉ những con số làm hoặc không chia sẻ tất cả các yếu tố phổ biến?) Tôi nghĩ rằng đó là gọn gàng gói gọn trong k, n, mphương trình của bạn , nhưng để thực sự quấn đầu quanh nó, tôi sẽ cần phải xem một cốt truyện 3d. Bất kể, cũng xứng đáng +1 cho bạn.
Patrick M

1
@PatrickM: "Ngoài ra: có một từ để chỉ các số làm hoặc không chia sẻ tất cả các yếu tố phổ biến không?": Bất kỳ số nguyên nào cũng là một yếu tố của chính nó, vì vậy nếu tất cả các yếu tố của m là các yếu tố của n , thì nó sẽ theo sau một cách tầm thường m là một yếu tố của n . Một thuật ngữ cho điều này, như bạn biết rõ, là yếu tố . Một cái khác là ước số .
ruakh

6

Khi bạn vượt ra ngoài phạm vi của các giá trị được chấp nhận, câu trả lời là có. Điều đó nói rằng, hầu hết mọi thứ trong phạm vi sẽ có một đại diện. Tham chiếu thập phân C # Mặc dù không được nêu trong đặc tả, các số vô tỷ có thể được biểu diễn chính xác (ví dụ: e 1 , pi, căn bậc hai của 2, v.v.).

Từ khóa thập phân biểu thị loại dữ liệu 128 bit. So với các loại dấu phẩy động, loại thập phân có độ chính xác cao hơn và phạm vi nhỏ hơn, điều này làm cho nó phù hợp cho các tính toán tài chính và tiền tệ. Phạm vi gần đúng và độ chính xác cho loại thập phân được hiển thị trong bảng sau.

Độ chính xác: 28-29 chữ số có nghĩa

1 Cảm ơn MichaelT đã nhắc nhở tôi về một số vô tỷ khác.


2
@Magus xem xét số vô tỷ e(2,71 ...). Nhật ký tự nhiên - ln (x) là log cơ sở e. Vì vậy, các cơ sở phi lý có tồn tại và hữu ích. Tính hữu dụng đặc biệt của cơ sở pi, tôi không chắc chắn - nhưng điều đó không có nghĩa là nó không được sử dụng ở đâu đó.

6
@Max bạn đang đi lạc ngày càng nhiều vào các câu hỏi toán học. Bạn có thể tìm thấy Nếu một số là không hợp lý trong cơ sở 10, nó có bất hợp lý trong các cơ sở khác không? để trở thành một bài đọc hữu ích và là điểm khởi đầu cho các câu hỏi lý thuyết số nhiều hơn.

2
1/3 không hợp lý.
Adam Zuckerman

2
OP hỏi về cơ sở 10 (mười). Tạo một cơ sở hệ thống số của bất cứ thứ gì sẽ cho phép bạn thể hiện bất cứ điều gì là 10. Dựa trên bài viết Wikipedia , sử dụng một số vô tỷ làm cơ sở không làm cho nó hợp lý. Các số hợp lý có thể được biểu thị dưới dạng số nguyên cho cả tử số và mẫu số, lặp lại các số trong một số thập phân hoặc kết thúc hữu hạn các số trong một số thập phân.
Adam Zuckerman

5
@FrustratedWithFormsDesigner Sự bất hợp lý không liên quan gì đến căn cứ. Chà, đó là một lời nói quá, nhưng đó là sự bất hợp lý có liên quan đến đại diện của số trong các cơ sở khác nhau (ví dụ: liệu nó có các chữ số không lặp lại vô hạn), không phải là cách khác. Đọc câu hỏi math.se được liên kết đến ở trên: math.stackexchange.com/questions/625473/ từ

1

Một loại dấu phẩy động cơ sở hai sẽ có thể biểu diễn chính xác nhiều giá trị mà loại cơ sở mười có cùng kích thước không thể. Bất kỳ giá trị nào có thể được biểu diễn chính xác bởi loại cơ sở 2 có kích thước nào đó sẽ có thể được biểu diễn chính xác trong loại mười cơ sở có kích thước đủ. Kích thước bắt buộc cho loại mười cơ sở thuần túy để biểu thị tất cả các giá trị của số dấu phẩy động nhị phân sẽ phụ thuộc vào phạm vi số mũ của loại nhị phân; hàng trăm bit cho a float, hoặc hàng nghìn cho a double.

Điều đó đã được nói, Decimalloại này đủ lớn để có thể sử dụng thành loại "phổ quát" có khả năng giữ giá trị của bất kỳ số nguyên thủy nào khác và cung cấp một số tính năng bổ sung khác bên cạnh (nếu không có gì khác, hãy sử dụng một bit để cho biết liệu giá trị được lưu trữ có phải là kết quả của việc chuyển đổi a doublehay không và nếu bit đó được đặt, sử dụng 64 bit để giữ giá trị trong câu hỏi). Microsoft đã chọn không làm điều đó, tuy nhiên. Kết quả là, chuyển đổi một doubleđến Decimalsẽ thất bại hoàn toàn cho các giá trị lớn, sẽ gây ra các giá trị nhỏ để được làm tròn đến 1E-28 gần nhất. Hơn nữa, ngay cả trong phạm vi năng động củadecimal, phương thức chuyển đổi sẽ không "khứ hồi". Ví dụ: đánh giá 1.0 / 3.0 là gấp đôi sẽ mang lại 0.3333333333333333148, nhưng chuyển đổi thành số thập phân sẽ mang lại 0.333333333333333m và chuyển đổi trở lại gấp đôi sẽ mang lại 0.3333333333333329818.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.