Câu hỏi này nảy sinh ra một cái gì đó kỳ lạ mà tôi nhận thấy sau khi điều tra this question thêm ...Trong MATLAB, các biến REALLY có chính xác kép theo mặc định không?
tôi luôn luôn hiểu biến MATLAB là double-precision theo mặc định. Vì vậy, nếu tôi được làm một cái gì đó giống như khai báo một biến với 20 chữ số sau dấu thập phân:
>> num = 2.71828182845904553488;
>> class(num) %# Display the variable type
ans =
double
Tôi mong chờ 4 chữ số cuối cùng được bỏ qua, kể từ khi floating-point relative accuracy là vào thứ tự của 10 -16:
>> eps(num)
ans =
4.440892098500626e-016
Nếu tôi cố gắng để hiển thị số với hơn 16 chữ số sau dấu thập phân (sử dụng một trong hai FPRINTF hoặc SPRINTF), tôi nhận được những gì tôi mong đợi để xem:
>> fprintf('%0.20f\n',num)
2.71828182845904550000
>> sprintf('%0.20f',num)
ans =
2.71828182845904550000
Nói cách khác, chữ số 17 thông qua 20 đều là 0.
Nhưng mọi thứ trở nên kỳ lạ khi tôi vượt qua num
đến variable precision arithmetic function trong Symbolic Toolbox, nói với nó để đại diện cho số sử dụng 21 chữ số chính xác:
>> vpa(num,21)
ans =
2.71828182845904553488
GÌ ?! Bốn chữ số cuối cùng đã xuất hiện trở lại! Không nên họ đã bị mất khi số lượng ban đầu tôi nhập vào được lưu trữ như là một biến chính xác hai lần num
? Vì num
là biến số chính xác kép khi được chuyển đến vpa
, cách vpa
biết chúng là gì? Tôi nghĩ tốt nhất là những gì đang xảy ra là MATLAB nội bộ đại diện cho num
với độ chính xác cao hơn gấp đôi kể từ khi tôi khởi tạo nó thành một số có nhiều chữ số hơn dấu thập phân so với biến số chính xác kép có thể xử lý. Đây có thực sự là những gì đang xảy ra, hoặc là cái gì khác đang xảy ra?
BONUS: Và đây là một nguồn bổ sung của sự nhầm lẫn nếu bạn chưa có một nửa đầu từ trên ...
>> num = 2.71828182845904553488; %# Declare with 20 digits past the decimal
>> num = 2.718281828459045531; %# Re-declare with 18 digits past the decimal
>> vpa(num,21)
ans =
2.71828182845904553488 %# It's the original 20-digit number!!!
+1 để trả lời câu hỏi thú vị! – Jonas
Aha! Vì vậy, tôi đã tình cờ sử dụng việc mở rộng thập phân chính xác của một giá trị nhị phân làm số kiểm tra của tôi. Điều này thật ý nghĩa ngay lúc này! Không chắc làm sao tôi có thể bỏ lỡ điều đó, mặc dù ... có lẽ đó là do thiếu ngủ vì con gái tôi đang mọc răng và giữ tôi suốt đêm. ;) – gnovice
@Andrew: bạn có đang làm việc tại MathWorks không? – Mikhail