Tính toán thực tế: dấu phẩy động so với TTE so với lý thuyết miền vs v.v


19

Hiện tại, việc tính toán các số thực trong hầu hết các ngôn ngữ phổ biến vẫn được thực hiện thông qua các phép toán dấu phẩy động. Mặt khác, các lý thuyết như hiệu quả loại hai (TTE) và lý thuyết miền từ lâu đã hứa hẹn tính toán chính xác của thực tế. Rõ ràng, vấn đề về độ chính xác của dấu phẩy động không giảm đi mức độ phù hợp, vậy tại sao những lý thuyết này không trở nên chính thống hơn và tại sao không có những triển khai dễ thấy hơn về chúng?

Ví dụ: có các miền ứng dụng mà chúng ta không quan tâm nhiều về lỗi dấu phẩy động? Có những mối quan tâm phức tạp đáng kể?

Câu trả lời:


17

Tôi làm việc trong tính toán số thực, và tôi ước tôi biết câu trả lời thực sự. Nhưng tôi có thể suy đoán. Đó là một vấn đề xã hội học, tôi nghĩ vậy.

Cộng đồng của những người làm việc trên số học thực sự chính xác bao gồm các nhà lý thuyết không quen phát triển phần mềm. Vì vậy, họ thường giao nhiệm vụ triển khai cho học sinh (một ngoại lệ đáng chú ý là iRRAM của Norbert Müller ) hoặc họ có các triển khai đồ chơi của riêng mình .

Những người làm có lập trình cần thiết mojo không có nền tảng lý thuyết cần thiết. Nếu không có nền tảng lý thuyết vững chắc, rất khó để thiết kế chính xác số học thực sự chính xác. Ví dụ, thật sai lầm khi thêm nhiều số thực vào một forvòng lặp, vì bạn sẽ nhận được hiệu suất không được chấp nhận do mất độ chính xác. Nếu bạn muốn thêm nhiều và nhiều thực, bạn nên làm điều đó với cấu trúc giống như cây, có tính đến độ lớn của các khoản tiền một phần. Một điều khác rất khó để vượt qua là <=vì tổng hàm boolean trên thực tế đơn giản là không tồn tại (bạn có thể có =nhưng nó trả về falsehoặc nó phân kỳ và <phân kỳ khi có hai số thực bằng nhau).

Cuối cùng, không rõ ràng về việc chúng ta biết cách triển khai các thư viện cho số học thực sự chính xác. Chúng không phải là những phần thông thường của thư viện chỉ xác định một số kiểu dữ liệu và một số hàm trên chúng. Thông thường số học thực sự chính xác đòi hỏi các chế độ kiểm soát đặc biệt. Ví dụ, iRRAM đảm nhận việc thực thi chính của chương trình (theo nghĩa đen là chiếm quyền điều khiển main), cũng như đầu vào và đầu ra tiêu chuẩn, để nó có thể chạy lại chương trình khi xảy ra mất độ chính xác. Thư viện của tôi cho số học thực sự trong Haskell xảy ra trong một Stagedđơn nguyên (về cơ bản là Readerđơn nguyên). Hầu hết mọi người mong đợi các số thực là "chỉ là một kiểu dữ liệu khác", nhưng tôi nghi ngờ về điều đó.


Tôi gần như hoàn toàn ăn nhập vào số học thực sự chính xác, nhưng không ai có thể thực hiện tổng kết Kahan trong đó?
jjg 16/07/2015

1
Hmm, tôi không nghĩ vậy. Hãy nghĩ về số học thực chính xác như số học khoảng mà tự điều chỉnh độ chính xác trung gian để đạt được độ chính xác đầu ra mong muốn.
Andrej Bauer

3
Ngoài việc các lập trình viên thiếu hiểu biết về thực tế rằng số thực là đối tượng vô hạn và hậu quả của nó đối với những gì có thể được lập trình, tôi nghĩ rằng thiếu hỗ trợ phần cứng cũng rất quan trọng. Thật khó để thuyết phục mọi người sử dụng một cái gì đó với chi phí thời gian và bộ nhớ đáng kể chỉ vì tính chính xác.
Kaveh

1
Tôi thấy rằng có một số hoạt động trong việc thực hiện tính toán thực tế với các loại cưỡng chế. Tôi cảm thấy rằng các kiểu cưỡng chế vẫn còn khá khó khăn để hiểu đúng (tôi chắc chắn không có chuyên gia về nó), nhưng bạn có nghĩ điều này hứa hẹn cho việc sử dụng rộng rãi hơn tính toán chính xác không?
SorcererofDM

3
Bất kỳ triển khai nào sử dụng các dòng chữ số, hoặc bất cứ thứ gì khác có tốc độ hội tụ cố định, đều bị vô hiệu hóa ngay từ đầu vì nó sẽ hội tụ quá chậm. Ngoài ra, việc triển khai dựa trên luồng có xu hướng buộc bạn phải tính toán tất cả các xấp xỉ trước đó để có được lần tiếp theo, đây cũng là một lỗi thiết kế.
Andrej Bauer

10

Nói chung, mọi người luôn quan tâm đến lỗi dấu phẩy động. Tuy nhiên, tôi không đồng ý với Andrej và tôi không nghĩ rằng phao được ưa thích hơn so với thực tế chính xác tùy ý (phần lớn) vì lý do xã hội học.

Tôi tin rằng lập luận chính chống lại tính toán chính xác của thực tế là một trong những hiệu suất . Vì vậy, câu trả lời ngắn gọn là, bất cứ khi nào hiệu suất quan trọng hơn độ chính xác, bạn sẽ muốn sử dụng số dấu phẩy động .

Ứng dụng gây chú ý là sử dụng động lực học chất lỏng tính toán để thiết kế tính khí động học của ô tô hoặc máy bay, trong đó các lỗi nhỏ trong tính toán dễ dàng được tạo ra nhờ lợi ích thiên văn của việc sử dụng các đơn vị điểm nổi chuyên dụng được tìm thấy trong nhiều bộ xử lý rộng rãi.

Cụ thể, vấn đề đại diện cho một loạt các số thực bằng cách sử dụng một số bit cố định không phải là chuyện nhỏ như thoạt nhìn có vẻ như vậy. Trong mô phỏng số, các giá trị có thể thay đổi lớn (ví dụ khi có nhiễu loạn), do đó, việc tính toán điểm cố định không phù hợp.

Ngay cả khi phần cứng không được cố định bởi phần cứng, sử dụng số chính xác tùy ý có thể chậm hơn vài bậc so với sử dụng số dấu phẩy động. Trong thực tế, ngay cả trong trường hợp đẹp là tất cả các số đều hợp lý, các thao tác đơn giản như đảo ngược ma trận có thể dẫn đến mẫu số lớn, khó kiểm soát (xem ví dụ ở đây ). Nhiều gói tối ưu hóa tuyến tính lớn sử dụng các điểm nổi với các chế độ làm tròn thích hợp để tìm các giải pháp gần đúng vì vấn đề chính xác này (ví dụ: phần lớn các chương trình được tìm thấy ở đây ).


1
Có bất kỳ khoảng cách đã được chứng minh nào giữa một số hình thức tính toán chính xác thực và tính toán dấu phẩy động không?
SorcererofDM

1
Không phải tôi biết, tôi sợ. Sean Gao có một số kết quả thú vị về sự phức tạp của các thủ tục quyết định gần đúng so với thực tế (xem tóm tắt luận án của anh ta ) và tất nhiên mẫu số trong nghịch đảo của một ma trận phát triển tồi tệ nhất như định thức của nó .
cody

-6

π

Quan điểm của tôi là nếu bạn định tính toán chính xác, bạn phải có chỗ dành sẵn cho những cái tên đặc biệt cũng như những cái tên quen thuộc của người tự nhiên. Tại một số điểm bạn sẽ muốn ước tính giá trị chính xác để áp dụng nó vào một cái gì đó trong thế giới thực. Hóa ra, sẽ hiệu quả hơn nhiều nếu chỉ giải quyết toàn bộ vấn đề dưới dạng xấp xỉ ngay từ đầu, trừ khi bạn có nhu cầu rất chuyên biệt.

R

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.