Đại diện cho một số thực mà không mất độ chính xác


10

Điểm nổi hiện tại (ANSI C float, double) cho phép biểu thị xấp xỉ một số thực.
Có cách nào để biểu diễn số thực mà không có lỗi không?
Đây là một ý tưởng tôi có, đó là bất cứ điều gì nhưng hoàn hảo.

Ví dụ: 1/3 là 0,3333333 ... (cơ sở 10) hoặc o.01010101 ... (cơ sở 2), nhưng cũng là 0,1 (cơ sở 3)
Có nên thực hiện "cấu trúc" này không:

base, mantissa, exponent

vì vậy 1/3 có thể là 3 ^ -1

{[11] = base 3, [1.0] mantissa, [-1] exponent}

Còn ý tưởng nào khác không?


12
Bạn sẽ chỉ có thể đại diện cho số hữu tỷ theo cách này.
Andrej Bauer

Làm thế nào để bạn đề xuất để thực hiện các phép toán số học trên các số trong biểu diễn này? Sử dụng logarit để thay đổi cơ sở? Đây sẽ là nhiều đắt hơn IEEE dấu chấm động toán học.
David Zhang

Chà, tôi không biết nữa. Tôi không phải là kỹ sư :) Rõ ràng, tôi không thể thực hiện nó trong phần cứng. Việc triển khai chậm, không hiệu quả có thể được thực hiện trong C. Đây sẽ chỉ là một thử nghiệm
bao gồm

Câu trả lời:


20

Tất cả phụ thuộc vào những gì bạn muốn làm.

Ví dụ, những gì bạn thể hiện là một cách tuyệt vời để biểu diễn các số hữu tỷ. Nhưng nó vẫn không thể đại diện cho một cái gì đó như hoặc một cách hoàn hảo.eπe

Trên thực tế, nhiều ngôn ngữ như Haskell và Scheme đã được xây dựng để hỗ trợ cho các số hữu tỷ, lưu trữ chúng ở dạng trong đó là các số nguyên. a,baba,b

Lý do chính mà những thứ này không được sử dụng rộng rãi là hiệu suất. Số dấu phẩy động là một chút không chính xác, nhưng hoạt động của chúng được thực hiện trong phần cứng. Hệ thống đề xuất của bạn cho phép độ chính xác cao hơn, nhưng yêu cầu một số bước để thực hiện, trái ngược với một thao tác duy nhất có thể được thực hiện trong phần cứng.

Người ta biết rằng một số số thực là không thể tính toán được, chẳng hạn như các số tạm dừng . Không có thuật toán liệt kê các chữ số của nó, không giống như , nơi chúng ta có thể tính toán chữ số thứ miễn là chúng ta chờ đợi đủ lâu.nπn

Nếu bạn muốn độ chính xác thực sự cho những thứ không hợp lý hoặc số siêu việt, bạn có thể cần phải sử dụng một số loại hệ thống đại số tượng trưng, ​​sau đó nhận câu trả lời cuối cùng ở dạng biểu tượng, bạn có thể xấp xỉ với bất kỳ số chữ số nào. Tuy nhiên, vì các vấn đề không thể giải quyết được nêu ở trên, phương pháp này nhất thiết bị hạn chế. Nó vẫn tốt cho những thứ như tích phân gần đúng hoặc chuỗi vô hạn.


Tôi có thể hỏi một câu hỏi khác? Nếu bạn đã từng là một kỹ sư của Intel vào những năm 80, bạn sẽ "thiết kế" định dạng số thực của mình như thế nào?
incud

3
Tôi không đủ điều kiện để trả lời rằng, vì tôi không phải là kỹ sư, tôi là nhà nghiên cứu lý thuyết. Tôi không thấy sai nhiều với tiêu chuẩn kép và tiêu chuẩn của IEEE, và giờ là quad. Tôi không nghĩ đã có nhiều ứng dụng tùy thuộc vào số học có độ chính xác cao hơn và những ứng dụng có thể sử dụng phiên bản hỗ trợ phần mềm.
jmite

Đại số tượng trưng không phải là chủ nghĩa hình thức chính xác cho số học thực sự chính xác. Bạn cần một đại diện cho phép bọ ngựa lớn tùy ý.
Andrej Bauer

8
@AndrejBauer: Một mantissa lớn tùy ý sẽ không cứu bạn nếu bạn muốn có một đại diện chính xác của . 2
user2357112 hỗ trợ Monica

@jmite bạn quá khiêm tốn :)
incud

22

Không có cách nào để biểu diễn tất cả các số thực mà không có lỗi nếu mỗi số có một biểu diễn hữu hạn. Có vô số số thực nhưng chỉ có vô số chuỗi hữu hạn 1 và 0 mà bạn có thể sử dụng để biểu diễn chúng.


Người ta có thể hạn chế yêu cầu đại diện cho mọi số thực chỉ giới hạn các số thực đó, có thể là đầu ra của một máy turing. Đó sẽ chỉ là một số lượng thực các số thực, nhưng vẫn sẽ bao gồm mọi số bạn muốn đại diện. Nhưng tôi không nghĩ bạn có thể tính toán hiệu quả với những con số như vậy.
kasperd

3
@kasperd Chúng được gọi là thực tế tính toán . Thật không may, những thứ như bình đẳng không thể tính toán được trên thực tế tính toán.
David Richerby

Thực sự khá rõ ràng rằng tính toán bình đẳng trên những con số như vậy tương đương với việc giải quyết vấn đề tạm dừng. Cho một TM người ta có thể định nghĩa một số thực, bắt đầu bằng rất nhiều số thập phân bằng 0, chính xác bằng thời gian chạy của TM, và sau đó là một số. So sánh số đó với số 0 tương đương với việc giải quyết vấn đề tạm dừng cho TM ban đầu.
kasperd

Câu trả lời này là sai. Alan Turing trong bài báo đầu tiên về máy móc, những người mà ông phát minh ra máy Turing, nói về việc đại diện cho thực tế dưới dạng chuỗi dữ liệu vô hạn . Điều này dẫn đến ý tưởng về cái gọi là "Máy Turing loại II", và có một lý thuyết rất thành công về tính toán số thực dựa trên ý tưởng. Nó cũng được thực hiện trong thực tế, xem câu trả lời của tôi.
Andrej Bauer

1
Có lẽ nó làm về mặt kỹ thuật, nhưng nó bỏ lỡ vấn đề, đó là có những biểu diễn vô hạn hoàn toàn hợp lý của các số thực. Và điều đó không có gì lạ: kết nối TCP / IP hoặc cuộc gọi Skype hoặc nguồn cấp dữ liệu video từ máy ảnh đều là những ví dụ về lượng dữ liệu vô hạn (có khả năng). Không có giới hạn tiên nghiệm về số lượng thông tin họ có thể cung cấp. Chỉ có một giới hạn về số lượng thông tin bạn có thể nhận được từ nó trong một khoảng thời gian hữu hạn.
Andrej Bauer

7

Ý tưởng của bạn không hoạt động vì một số được biểu thị trong cơ sở với mantissa và số mũ là số hữu tỷ , do đó đại diện của bạn hoạt động chính xác cho các số hữu tỷ và không có số khác. Chẳng hạn, bạn không thể đại diện cho .m e b m - e bmebme2

Có cả một nhánh của toán học tính toán liên quan đến số học thực sự chính xác. Nhiều cấu trúc dữ liệu để biểu diễn các số thực chính xác đã được đề xuất: các dòng chữ số, các dòng co thắt affine, các chuỗi hợp lý Cauchy, các chuỗi Cauchy của các hợp lý dyadic, các phép cắt Dedekind, các chuỗi các khoảng shkrinking, v.v. về những ý tưởng này, ví dụ:

Trong số các iRRAM này là trưởng thành và hiệu quả nhất. Marshall trong một dự án thử nghiệm, trong khi dự án thứ ba là một dự án sinh viên, nhưng cũng là dự án dễ tiếp cận nhất. Nó có một giới thiệu rất hay giải thích các vấn đề liên quan đến tính toán số thực, tôi khuyên bạn nên xem xét nó.

Hãy để tôi nhận xét. Ai đó sẽ phản đối rằng một đối tượng vô hạn không thể được đại diện bởi một máy tính. Trong một số ý nghĩa, điều này là đúng, nhưng trong một số khác thì không. Chúng ta không bao giờ phải đại diện cho toàn bộ một số thực, chúng ta chỉ cần một xấp xỉ hữu hạnở mỗi giai đoạn tính toán. Do đó, chúng ta chỉ cần một đại diện có thể đại diện cho một độ chính xác đến bất kỳ độ chính xác nào. Tất nhiên, một khi chúng ta hết bộ nhớ máy tính, chúng ta hết bộ nhớ máy tính - nhưng đó là một hạn chế của máy tính, không phải bản thân đại diện. Tình huống này không khác gì nhiều người khác trong lập trình. Chẳng hạn, mọi người sử dụng số nguyên trong Python và họ nghĩ chúng là "lớn tùy ý" mặc dù tất nhiên chúng không thể vượt quá kích thước của bộ nhớ khả dụng. Đôi khi vô cực là một xấp xỉ hữu ích cho một số hữu hạn rất lớn.

Hơn nữa, tôi thường nghe tuyên bố rằng máy tính chỉ có thể xử lý các số thực tính toán được . Điều này bỏ lỡ hai điểm quan trọng. Đầu tiên, máy tính có quyền truy cập dữ liệu từ thế giới bên ngoài, vì vậy chúng tôi cũng sẽ phải đưa ra giả định (không thể kiểm chứng) rằng thế giới bên ngoài cũng có thể tính toán được. Thứ hai, chúng ta cần phân biệt giữa những gì thực sự mà một máy tính có thể tính toán và những gì thực sự nó có thể đại diện. Chẳng hạn, nếu chúng ta chọn các dòng chữ số làm đại diện cho các số thực thì hoàn toàn có thể đại diện cho một số thực không tính toán được: nếu ai đó đưa nó cho chúng ta, chúng ta sẽ biết cách biểu diễn nó. Nhưng nếu chúng ta chọn biểu diễn các số thực dưới dạng các đoạn mã nguồn tính toán các chữ số, thì rõ ràng chúng ta không thể biểu diễn các số thực không tính toán được.

Trong mọi trường hợp, chủ đề này được giải quyết tốt nhất với một số đọc thêm.


+1 nhưng tôi sẽ phản đối rằng bạn không thể biểu diễn một chuỗi vô hạn bằng một xấp xỉ hữu hạn mà không làm mất độ chính xác , theo yêu cầu của câu hỏi. Chắc chắn, bạn có thể có được độ chính xác như bạn muốn - như bạn có thể bằng cách xấp xỉ bằng một tỷ lệ hợp lý - nhưng đó không hoàn toàn là những gì câu hỏi yêu cầu. Có thể cho rằng, đó là một vấn đề với câu hỏi, hơn là câu trả lời.
David Richerby

2
Vấn đề là chúng tôi không đại diện với các chuỗi hữu hạn. Chúng tôi đại diện cho các chuỗi vô hạn , nhưng chúng tôi chỉ cần một phần hữu hạn của một chuỗi vô hạn như vậy ở mỗi giai đoạn tính toán. Hoặc nói một cách khác: không mất các giới hạn, vì cấu trúc dữ liệu chứa toàn bộ thông tin, nhưng tất nhiên bạn không thể truy cập hoặc xử lý tất cả thông tin cùng một lúc: cấu trúc dữ liệu cung cấp cho bạn độ chính xác như bạn yêu cầu . Nút thắt không nằm ở phía cấu trúc dữ liệu, mà nằm ở phía "người tiêu dùng", những người muốn lấy thông tin từ đó.
Andrej Bauer

22=2k2 k222k1.99...

2
@Thomas: tính toán biểu tượng không đại diện cho số thực, nhưng thường là một số trường con của số thực, điển hình là trường được tạo bởi các hàm cơ bản và gốc của đa thức. Các trường con này không hoàn thành (đóng dưới các giới hạn của trình tự Cauchy) cũng không hoàn thành tính toán (đóng dưới các giới hạn tính toán của trình tự Cauchy). Một đại diện không phải là một đại diện của các thực thể trừ khi bạn có thể đại diện cho tất cả các thực (tính toán): và các tính toán tượng trưng không thành công điều kiện này.
Andrej Bauer

1
Những nhận xét về khả năng đếm là không liên quan vì thực tế tính toán không thể tính được.
Andrej Bauer

7

Có nhiều triển khai Số Rational hiệu quả nhưng một triển khai đã được đề xuất nhiều lần và thậm chí có thể xử lý một số bất hợp lý khá tốt là Phân số tiếp tục .

Trích dẫn từ phân số tiếp theo của Darren C. Collins :

Định lý 5-1. - Biểu thức phân số tiếp tục của một số thực là hữu hạn khi và chỉ khi số thực là số hữu tỷ.

Trích dẫn từ Mathworld - Phân số tiếp tục định kỳ

... một phần tiếp tục là iff định kỳ, nó là một gốc của đa thức bậc hai.

tức là tất cả các gốc có thể được biểu thị dưới dạng phân số tiếp tục định kỳ.

Ngoài ra còn có Phân số tiếp tục chính xác cho π khiến tôi ngạc nhiên cho đến khi @AndrejBauer chỉ ra rằng nó thực sự không phải vậy.


ππ

Đại diện phân số liên tục của các số thực đã được đề xuất như là một triển khai cho số học thực chính xác một thời gian trước đây của J. Vuillemin. Hóa ra nó không hiệu quả lắm vì những con số trở nên khá lớn khá sớm và thật khó để cắt giảm kích thước của chúng.
Andrej Bauer

Các phân số tiếp tục có một số vấn đề tính toán ngay cả khi biểu diễn các số hữu tỷ - trong khi chúng có thể được so sánh tương đối nhanh chóng bằng cách sử dụng một biến thể của thứ tự từ điển, và trong khi thao tác một phân số tiếp tục đơn giản, cả phép cộng và phép nhân trên CF đều hoạt động khá phức tạp triển khai thực hiện.
Steven Stadnicki

5

Có một số gợi ý "chính xác thực" trong các bình luận (ví dụ: các phân số tiếp tục, các phép biến đổi phân số tuyến tính, v.v.). Điều hấp dẫn điển hình là trong khi bạn có thể tính toán các câu trả lời cho một công thức, thì sự bình đẳng thường không thể giải quyết được.

Tuy nhiên, nếu bạn chỉ quan tâm đến các số đại số, thì bạn thật may mắn: Lý thuyết về các trường đóng thực sự đã hoàn tất, tối thiểu và có thể quyết định. Điều này đã được chứng minh bởi Tarski vào năm 1948.

Nhưng có một nhược điểm. Bạn không muốn sử dụng thuật toán của Tarski, vì nó thuộc lớp KHÔNG phức tạp, không thực tế như các thuật toán không thực tế có thể có được. Có nhiều phương pháp gần đây làm giảm độ phức tạp xuống DEXP, đây là phương pháp tốt nhất hiện nay chúng tôi biết.

Lưu ý rằng vấn đề là NP-hard vì nó bao gồm SAT. Tuy nhiên, nó không được biết (hoặc tin) ở trong NP.

EDIT Tôi sẽ cố gắng giải thích điều này nhiều hơn một chút.

Khuôn khổ để hiểu tất cả những điều này là một vấn đề quyết định được gọi là Lý thuyết Modulo Hài lòng, hay viết tắt là SMT. Về cơ bản, chúng tôi muốn giải SAT cho một lý thuyết được xây dựng dựa trên logic cổ điển.

Vì vậy, chúng tôi bắt đầu với logic cổ điển thứ nhất với một bài kiểm tra đẳng thức. Những biểu tượng chức năng nào chúng ta muốn đưa vào và những tiên đề của chúng được xác định liệu lý thuyết có thể quyết định được hay không.

Có rất nhiều lý thuyết thú vị được thể hiện trong khuôn khổ SMT. Ví dụ, có các lý thuyết về cấu trúc dữ liệu (ví dụ: danh sách, cây nhị phân, v.v.) được sử dụng để giúp chứng minh các chương trình chính xác và lý thuyết về hình học Euclide. Nhưng với mục đích của chúng tôi, chúng tôi đang xem xét các lý thuyết về các loại số khác nhau.

Số học Presburger là lý thuyết về số tự nhiên với phép cộng. Lý thuyết này là quyết định.

Số học Peano là lý thuyết về số tự nhiên với phép cộng và phép nhân. Giả thuyết này không thể quyết định được, như đã được chứng minh bởi Gôdel.

Số học Tarski là lý thuyết về các số thực với tất cả các phép toán trường (cộng, trừ, nhân và chia). Thật thú vị, lý thuyết này là quyết định. Đây là một kết quả rất phản trực quan tại thời điểm đó. Bạn có thể cho rằng vì đó là "siêu số" của các số tự nhiên nên "khó" hơn, nhưng đây không phải là trường hợp; ví dụ, so sánh lập trình tuyến tính trên các số hữu tỷ với lập trình tuyến tính trên các số nguyên.

Có vẻ như không rõ ràng rằng thỏa mãn là tất cả những gì bạn cần, nhưng nó là. Ví dụ: nếu bạn muốn kiểm tra xem căn bậc hai dương của 2 có bằng căn bậc ba thực của 3 hay không, bạn có thể biểu thị điều này như là vấn đề thỏa đáng:

x.x>0x22=0x33=0

ex

sin{xπ|sinx=0}sin

exeix


Alfred Tarski (1948), Phương pháp quyết định cho Đại số và Hình học cơ bản .


2

Có thể biểu diễn một lớp số rất lớn gọi là số đại số chính xác, bằng cách coi chúng là gốc của đa thức.

πe


eeixsincos{xR|sinx=0}

@Pseudonymous Điều này có vẻ thực sự thú vị, nhưng tôi không nghĩ rằng tôi có nền tảng toán học để hiểu đúng về nó ... Ý bạn là gì khi "đủ gần với các số nguyên"?
Nhiều trục hơn

Tôi sẽ sửa đổi câu trả lời của tôi để giải thích.
Bút danh

1

π2


Câu trả lời này là sai. Có cả một khu vực của số học thực chính xác giải thích cách biểu diễn thực bằng máy tính. Giả định rằng một thực tế phải được đại diện bởi một chuỗi hữu hạn bị nhầm lẫn. Chúng ta cũng có thể sử dụng chuỗi vô hạn. Alan Turing đã viết về điều này trong bài báo đầu tiên của mình , người mà ông đã phát minh ra máy Turing!
Andrej Bauer

Bạn có thể liên kết đến một bài báo về cách lưu trữ và thao tác các chuỗi nhiễm trong máy tính thực tế không, vì đó sẽ là câu trả lời cho những gì câu hỏi được hỏi. Ngoài ra, đó không phải là bài báo đầu tiên của ông, ấn phẩm đầu tiên là năm 1936, bài báo đó là năm 1937.
lPlant

Bạn nói đúng đó là tờ giấy năm 1937. Để xem cách các chuỗi vô hạn được thao tác, ví dụ, bạn có thể xem giao thức TCP / IP. Tôi không bao giờ nói toàn bộ thực phải được lưu trữ trong máy tính.
Andrej Bauer

-1

Bạn không thể đại diện cho tất cả các số thực trong một máy tính, nhưng bạn có thể đại diện cho nhiều số. Bạn có thể sử dụng phân số sẽ đại diện cho số lượng nhiều hơn số float. Bạn cũng có thể làm những việc phức tạp hơn như biểu diễn các số là gốc của một số đa thức với một xấp xỉ rằng theo phương pháp newton sẽ hội tụ thành số.


Đây lại là một câu trả lời sai, được tạo ra từ sự thiếu hiểu biết. Có cả một khu vực của số học thực chính xác, nghiên cứu cách biểu diễn tất cả các thực bằng các cấu trúc dữ liệu phù hợp.
Andrej Bauer

@AndrejBauer Vì vậy, bạn đang đề xuất có một cấu trúc dữ liệu có thể đại diện cho bất kỳ số thực? Bất kỳ cấu trúc dữ liệu nào như vậy sẽ phải sử dụng một lượng bit vô hạn không thể đếm được để biểu diễn bất kỳ số nào.
Alice Ryhl

1
Trước tiên, một số lượng bit có thể đếm được là đủ, và vì bạn không cần tất cả chúng cùng một lúc, bạn cũng không thể xử lý tất cả chúng cùng một lúc, chúng có thể được lưu trữ trong thời gian cũng như không gian.
Andrej Bauer

@AndrejBauer Câu trả lời này là chính xác và nói điều tương tự như của bạn, mặc dù có rất ít thông tin. Bạn không thể đại diện cho tất cả các số thực trong một máy tính. Bạn có thể đại diện cho bất kỳ số thực, nhưng không phải tất cả cùng một lúc. Nếu có bất cứ điều gì, tôi sẽ tranh luận rằng bạn có thể đại diện cho nhiều người, vì bạn chỉ có thể đại diện cho nhiều người trong bất kỳ máy tính cụ thể nào và gần như không có (theo nghĩa toán học) trong một máy tính trừu tượng tương đương với các mô hình tính toán thông thường (Turing máy tương đương).
Gilles 'SO- ngừng trở nên xấu xa'

-1

Có thể biểu thị chính xác bất kỳ số nào trong đó các đầu vào có thể biểu diễn bằng cách lưu trữ chúng dưới dạng một chuỗi các hoạt động, ví dụ, bạn lưu trữ 1/3dưới dạng 1 divided by 3, bằng cách xử lý hủy các hoạt động, bạn có thể đơn giản hóa thao tác tiếp theo để đưa ra câu trả lời chính xác (1/3) * 3. Điều này cũng có thể xử lý các tình huống mà bạn đã biết những bất hợp lý như πbằng cách giữ lại nó trong tính toán của bạn.

Tuy nhiên, nó đòi hỏi số lượng bộ nhớ ngày càng tăng cho mỗi số và - giả sử bộ mô phỏng của bạn không hoàn hảo - có thể sẽ yêu cầu số lượng ngày càng tăng đối với các giá trị bạn đang làm việc rất nhiều.


5+262=3

Thật. Trên thực tế, có lẽ thực sự không thể tự động hóa hoàn toàn thành công. Tuy nhiên, kết quả vẫn chính xác ngay cả khi bạn không sử dụng cách biểu diễn đơn giản nhất có thể.
Jack Aidley
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.