Sử dụng Java trên PC Windows 7 (không chắc chắn) và gọi Math.cos() trên các giá trị trả về 0 (như pi/2) trả về các giá trị nhỏ, nhưng các giá trị nhỏ, trừ khi tôi hiểu lầm, lớn hơn nhiều so với 1 ulp từ 0.Phương thức Java Math.cos() không trả về 0 khi được mong đợi
Math.cos(Math.PI/2) = 6.123233995736766E-17
Math.ulp(Math.cos(Math.PI/2)) = 1.232595164407831E-32
Đây có phải là thực tế trong vòng 1 ulp và tôi chỉ đơn giản là nhầm lẫn? Và đây có phải là một phương pháp bao bọc có thể chấp nhận được để giải quyết sự không chính xác nhỏ này không?
public static double cos(double a){
double temp = Math.abs(a % Math.PI);
if(temp == Math.PI/2)
return 0;
return Math.cos(a);
}
@ dimo414 : Đầu tiên là một bình luận về "bạn không chắc chắn nếu có vấn đề". Hành vi của hầu hết các hoạt động toán học không được xác định chính xác để hệ điều hành và CPU có thể quan trọng. Nếu bạn muốn hoạt động toán học có hành vi được xác định nghiêm ngặt (có thể dễ dàng khắc phục sự cố) bạn muốn sử dụng StrictMath, không phải Toán (tất nhiên các hoạt động StrictMath có thể sẽ chậm hơn nếu chúng không thể sử dụng hoạt động tăng tốc phần cứng có sẵn trong CPU). – SyntaxT3rr0r
Math.cos() chỉ là một trình bao bọc cho StrictMath.cos(), mà chính nó là một hàm gốc. – dimo414