Số học dấu chấm động hoàn toàn khác với toán học thực. Đặc biệt, số học dấu phẩy động không phải là kết hợp hoặc phân phối. Do đó các biểu thức tương đương toán học không nhất thiết phải tương đương khi được đánh giá với số học dấu phẩy động chính xác hữu hạn. Đây là trường hợp ngay cả khi hoạt động cá nhân, chẳng hạn như cộng, trừ, nhân, chia và căn bậc hai tạo ra kết quả được làm tròn chính xác, theo yêu cầu của IEEE-754 floating-point standard.
Trong trường hợp này, g()
sẽ chính xác hơn nhiều so với mức trung bình f()
và cũng cho trường hợp cụ thể là x = 500
. Lý do là f()
bị hủy bỏ trừ. Điều này xảy ra trong quá trình trừ hiệu quả của hai số dấu phẩy động gần như giống nhau về độ lớn. Các chữ số hàng đầu hủy bỏ trong quá trình trừ, chỉ để lại một vài chữ số cuối còn lại nhập vào tính toán tiếp theo. Ngoài ra, bất kỳ lỗi làm tròn nào được tích lũy trong các số cuối của các toán hạng ban đầu được trừ có thể được phóng đại bằng tính toán tiếp theo. Bạn có thể tìm thấy giải thích mở rộng với ví dụ trong this Wikipedia article.
Trong trường hợp này, sqrt(x+1)
và sqrt(x)
có cùng độ lớn, đặc biệt khi độ lớn x
tăng. Sử dụng ví dụ của x = 500
và sử dụng IEEE-754 đơn chính xác số học, chúng ta thấy:
x = 500 f(x) = 0x1.659ae0p+3 (11.175156) reference = 0x1.659798p+3 (11.174755)
x = 500 g(x) = 0x1.659798p+3 (11.174755) reference = 0x1.659798p+3 (11.174755)
Các lỗi trong f(500)
là 420 ulps, trong khi g(500)
mang đến tròn một cách chính xác kết quả duy nhất chính xác.
Tắt chủ đề cho SO, thay vào đó hãy thử [math.stackexchange] (http://math.stackexchange.com/). –
Xin chào Claire, StackExchange được chia thành nhiều trang, tập trung vào các chủ đề khác nhau. Một trong số đó là [Toán học] (http://math.stackexchange.com/). Bạn nên đặt câu hỏi của bạn ở đó. – Stefan
Xin cảm ơn các bạn, tôi sẽ làm điều đó –