Tôi đang cố gắng thực hiện chức năng sau trong dấu phẩy động có độ chính xác kép với sai số tương đối thấp :
Điều này được sử dụng rộng rãi trong các ứng dụng thống kê để thêm xác suất hoặc mật độ xác suất được thể hiện trong không gian nhật ký. Tất nhiên, hoặc có thể dễ dàng tràn hoặc tràn, điều này sẽ rất tệ vì không gian nhật ký được sử dụng để tránh tràn vào vị trí đầu tiên. Đây là giải pháp điển hình:exp ( y )
Hủy bỏ từ sẽ xảy ra, nhưng được giảm nhẹ bởi . Tệ hơn nữa là khi và gần nhau. Đây là một biểu đồ lỗi tương đối:
Cốt truyện bị cắt ở để nhấn mạnh hình dạng của đường cong , về việc hủy bỏ xảy ra. Tôi đã thấy lỗi lên tới và nghi ngờ rằng nó sẽ trở nên tồi tệ hơn nhiều. (FWIW, chức năng "sự thật mặt đất" được triển khai bằng cách sử dụng các số float chính xác tùy ý của MPFR với độ chính xác 128 bit.)
Tôi đã thử các cải cách khác, tất cả đều có kết quả tương tự. Với là biểu thức bên ngoài, lỗi tương tự xảy ra bằng cách lấy nhật ký của một cái gì đó gần 1. Với làm biểu thức bên ngoài, việc hủy bỏ xảy ra trong biểu thức bên trong.
Bây giờ, lỗi tuyệt đối là rất nhỏ, vì vậy có lỗi tương đối rất nhỏ (trong một epsilon). Người ta có thể lập luận rằng, bởi vì người dùng thực sự quan tâm đến xác suất (không phải xác suất đăng nhập), lỗi tương đối khủng khiếp này không phải là vấn đề. Có vẻ như điều đó thường không xảy ra, nhưng tôi đang viết một chức năng thư viện và tôi muốn khách hàng của mình có thể tính được lỗi tương đối không tệ hơn nhiều so với lỗi làm tròn.
Có vẻ như tôi cần một cách tiếp cận mới. Nó có thể là gì?