Áp dụng độ chính xác của các hàm dấu phẩy động


9

Trong khi xem xét việc triển khai hàm của một lập trình viên khác để tính toán CDF phân phối bình thường , tôi đã đưa ra một đề nghị thay thế toàn bộ việc thực hiện bằng các hàm dựng sẵn của Python hoặc sử dụng SciPy, một thư viện khoa học phổ biến.

Lập trình viên khác chỉ ra rằng không phải math.erfc()và cũng không scipy.stats.norm.cdf()cung cấp bất kỳ đảm bảo độ chính xác trong tài liệu hướng dẫn của họ. Do đó, tôi nên thận trọng hơn trong việc thay thế một thuật toán gần đúng (được lấy từ một nguồn được tôn trọng và có giới hạn lỗi được ghi lại ).

Thành thật mà nói, ý nghĩ nghi ngờ tính chính xác và chính xác của chức năng thư viện hoặc tích hợp chưa bao giờ xuất hiện trong đầu tôi. Rốt cuộc, tôi đã gọi các chức năng như sin()sqrt()trong nhiều năm mà không cần suy nghĩ nhiều - tại sao nên math.erf()hay scipy.stats.norm.cdf()khác biệt?

Nhưng bây giờ, tôi quan tâm. Câu hỏi của tôi là:

  1. Nói chung, nếu tài liệu không đề cập đặc biệt, thì nó có ngụ ý rằng các loại hàm này hoàn toàn chính xác đến vị trí thập phân cuối cùng, trong độ chính xác được cung cấp bởi dấu phẩy động chính xác kép của IEEE không?
  2. Điều đó có đúng với Python math.erf()hay SciPy scipy.stats.norm.cdf()nói riêng không? Làm thế nào bạn có thể nói?
  3. Đây man pagesin() nói ...

    Các hàm này có thể mất độ chính xác khi đối số của chúng gần bội số pi hoặc khác xa 0,0.

    Tại sao phải cẩn thận như vậy tồn tại, khi chức năng sin là định kỳ và đối xứng? Dường như có một gánh nặng đặt lên người gọi để chuẩn hóa đầu vào để có được độ chính xác tối ưu.

    Mặt khác, tài liệu của Mozilla Math.sin()không nói gì về độ chính xác hay độ chính xác. Điều đó có nghĩa là nó hoàn toàn chính xác hay là "kiến thức phổ biến" Math.sin()sẽ chỉ chính xác trong một số trường hợp nhất định trong JavaScript, như mọi nơi khác?


1
FYI liên quan đến câu hỏi 1: Thông thường các đảm bảo độ chính xác được đưa ra dưới dạng ULP (đơn vị ở vị trí cuối cùng) trong đó đề cập đến các chữ số nhị phân của số float.

Câu trả lời:


10

Nếu tài liệu không đề cập đặc biệt, thì có nghĩa là các loại hàm này hoàn toàn chính xác đến vị trí thập phân cuối cùng, trong độ chính xác được cung cấp bởi dấu phẩy động chính xác kép của IEEE?

Tôi sẽ không đưa ra giả định đó.

Nơi tôi làm việc, chúng tôi xử lý dữ liệu đo từ xa và kiến ​​thức phổ biến rằng hai thư viện toán học khác nhau có thể tạo ra hai kết quả khác nhau, ngay cả khi cả hai đều tuân thủ các tiêu chuẩn điểm nổi của IEEE. Điều này có ý nghĩa khi bạn đang cố gắng lặp lại một phép tính và so sánh hai kết quả cho sự bằng nhau.

Dường như có một gánh nặng đặt lên người gọi để chuẩn hóa đầu vào để có được độ chính xác tối ưu.

Đó là một đánh giá công bằng. Điều làm cho nó được chấp nhận là các tài liệu nói rằng, do đó không có bất ngờ.

Mặt khác, tài liệu của Mozilla ...

Tôi khuyên bạn nên thử một vài tính toán trong mỗi thư viện hoặc ngôn ngữ lập trình (đặc biệt là gần các khu vực ranh giới như sin()gần bội số pi) và so sánh chúng. Điều này sẽ cung cấp cho bạn một ý tưởng hợp lý về loại hành vi bạn có thể mong đợi từ mỗi người.


2
Kiểm tra là một ý tưởng tốt. Có vô số lần tài liệu nói lên một điều, nhưng các chức năng lại hành xử theo cách khác. Và OP muốn dựa vào các giả định ngầm mà thậm chí không được ghi nhận.
Siyuan Ren
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.