2015-01-29 29 views
5

Bạn có 2 chức năng;Điểm nổi; Phân chia vs Phép nhân

f(x)= x(((x+1)^(1/2))-(x^(1/2)))  
g(x)= x/(((x+1)^(1/2))+(x^(1/2))) 

Cái nào chính xác hơn?

Lưu ý phụ: Nếu bạn có thể giải thích tại sao, điều đó thực sự giúp tôi, tôi có cảm giác là f (x) vì không có mẫu số nhưng tôi không chắc chắn 100%.

+1

Tắt chủ đề cho SO, thay vào đó hãy thử [math.stackexchange] (http://math.stackexchange.com/). –

+0

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

+0

Xin cảm ơn các bạn, tôi sẽ làm điều đó –

Trả lời

5

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)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.

+0

Vì tò mò, có những giá trị nào mà 'f' chính xác hơn không? Không chỉ "trung bình"? – Teepeemm

+0

OT: Lạ lùng là câu trả lời của tôi đã trở thành một wiki cộng đồng một cách tự động. @Teepeemm: Có, từ một kiểm tra cursory với các đối số chính xác đơn lẻ IEEE-754 ngẫu nhiên, rất nhiều trường hợp như vậy tồn tại. Ví dụ: 'x = 0x1.6fa276p-2 (3.59018177e-1); f (x) = 0x1.a09844p-3 (2.03415424e-1); g (x) = 0x1.a09846p-3 (2.03415439e-1); ref = 0x1.a09844p-3 (2.03415425e-1); ulperr (f) = 6.71231e-2; ulperr (g) = 9.32877e-1' – njuffa

Các vấn đề liên quan