Tại sao C# chấp nhận sự thiếu chính xác bằng cách sử dụng các điểm nổi để lưu trữ dữ liệu?
"C#" không chấp nhận sự cân bằng hiệu suất chính xác; người dùng làm hoặc không chấp nhận điều đó.
C# có ba loại dấu phẩy động - nổi, kép và thập phân - vì ba loại đó đáp ứng phần lớn các nhu cầu của các lập trình viên trong thế giới thực.
float và double là tốt cho các phép tính "khoa học" trong đó câu trả lời đúng với ba hoặc bốn chữ số thập phân luôn đủ gần, vì đó là độ chính xác mà phép đo ban đầu đi kèm. Giả sử bạn chia 10,00 cho 3 và nhận được 3.333333333333. Vì phép đo ban đầu có lẽ chính xác chỉ bằng 0,01, thực tế là kết quả tính toán bị giảm đi ít hơn 0,0000000000004 là không liên quan. Trong tính toán khoa học, bạn không đại diện cho số lượng đã biết chính xác. Việc hiển thị ở vị trí thập phân mười lăm là không liên quan nếu giá trị đo ban đầu chỉ chính xác đến vị trí thập phân thứ hai.
Điều này tất nhiên là không đúng với các tính toán tài chính. Các toán hạng tính toán tài chính thường chính xác đến hai chữ số thập phân và đại diện cho số lượng chính xác. Số thập phân là tốt cho tính toán "tài chính" vì kết quả hoạt động thập phân là chính xác với điều kiện tất cả đầu vào và đầu ra có thể được biểu diễn chính xác dưới dạng số thập phân (và tất cả đều nằm trong phạm vi hợp lý). Số thập phân vẫn có lỗi làm tròn, tất nhiên, nhưng các hoạt động chính xác là những lỗi mà bạn có thể muốn chính xác khi tính toán tài chính.
Và lợi ích của việc sử dụng nó trên các phương pháp khác là gì?
Bạn nên nêu rõ các phương pháp khác mà bạn muốn so sánh. Có rất nhiều kỹ thuật khác nhau để thực hiện các phép tính trên máy tính.
Ví dụ: Math.Pow (Math.Sqrt (2), 2) không chính xác trong C#. Có những ngôn ngữ lập trình có thể tính toán chính xác (ví dụ, Mathematica).
Hãy rõ ràng về điểm này; Mathematica không "tính" gốc 2 chính xác; số này là không hợp lý, vì vậy nó không thể được tính toán chính xác trong bất kỳ lượng lưu trữ hữu hạn nào. Thay vào đó, những gì mathematica làm là nó đại diện cho các con số như là các đối tượng mô tả cách số được tạo ra. Nếu bạn nói "cho tôi căn bậc hai của hai", thì Mathematica về cơ bản phân bổ một đối tượng có nghĩa là "việc áp dụng toán tử căn bậc hai tới số chính xác 2". Nếu bạn sau đó vuông đó, nó có logic mục đích đặc biệt mà nói "nếu bạn vuông cái gì đó là căn bậc hai của cái gì khác, trả lại giá trị ban đầu". Mathematica có các đối tượng đại diện cho các số đặc biệt khác nhau, như pi hoặc e, và một cơ thể lớn của các quy tắc cho cách thao tác khác nhau của những con số kết hợp với nhau.
Về cơ bản, hệ thống là tượng trưng hệ thống; nó thao tác các con số giống như cách mọi người làm khi họ làm toán học bút chì và giấy. Hầu hết các chương trình máy tính thao tác các con số như máy tính: thực hiện phép tính ngay lập tức và làm tròn nó đi. Nếu điều đó không được chấp nhận thì bạn nên dính vào một hệ thống tượng trưng.
Một lập luận tôi có thể nghĩ đến là tính nó chính xác là chậm hơn rất nhiều sau đó chỉ cần đối phó với sự thiếu chính xác, nhưng Mathematica & Matlab được sử dụng để tính toán các vấn đề khoa học khổng lồ, vì vậy tôi thấy khó để tin rằng những ngôn ngữ là thực sự chậm hơn đáng kể so với C#.
Không phải chúng chậm hơn, mặc dù nhân các điểm nổi thực sự cực kỳ nhanh trên phần cứng hiện đại. Đó là công cụ tính toán biểu tượng là vô cùng phức tạp. Nó mã hóa tất cả các quy tắc của toán học cơ bản và có rất nhiều quy tắc đó! C# không có ý định trở thành một công cụ tính toán biểu tượng cấp chuyên nghiệp, nó được dự định là một ngôn ngữ lập trình có mục đích chung.
MatLab chạy trong hộp cát Java. Nếu bạn không tin rằng MatLab là chậm hơn, hãy thử tạo một chương trình thời gian thực trong MatLab. Đã có, làm điều đó, không có niềm vui ... :-) –
Được rồi, nhưng Wolfram Mathematica sau đó? Tôi không thể tìm thấy điểm chuẩn trên internet mà nó được so sánh với C# –
[CAS] (http://en.wikipedia.org/wiki/Computer_algebra_system) được tích hợp vào máy tính TI-89 mà thực tế đã cho tôi thông qua các khóa học toán đại học các quần tắt của các chức năng toán học được xây dựng vào các.NET Framework, quá. Thực tế đơn giản là chúng được thiết kế cho các trường hợp sử dụng hoàn toàn khác nhau. –