2011-10-05 27 views
6
đang

Tiếp mang lại cho tôi 5,999999999999998 trong kết quả, nhưng câu trả lời đúng là 6.chính xác trong Erlang

Alpha = math:acos((4*4 + 5*5 - 3*3)/(2*4*5)) 
Area = 1/2 * 4 * 5 * math:sin(Alpha) 

Có thể để có được 6?

+5

Bạn không được đảm bảo nhận kết quả chính xác khi sử dụng số học dấu phẩy động. Chủ đề này đã được đề cập nhiều, nhiều, nhiều lần rồi. – Nayuki

Trả lời

23

Bạn đã chạy vào một vấn đề rất phổ biến mà nó có trang web riêng của mình, What Every Programmer Should Know About Floating-Point Arithmetic. Vấn đề là do cách số học dấu phẩy động làm việc trong khá nhiều CPU trên thị trường có hỗ trợ số học FP; nó không dành riêng cho Erlang.

Nếu số học dấu chấm động thường không cung cấp cho bạn độ chính xác hoặc chính xác bạn cần, bạn có thể sử dụng thư viện số học chính xác tùy ý thay vì số học tích hợp. Có lẽ thư viện nổi tiếng nhất như vậy là GMP, nhưng bạn phải bọc nó trong NIFs để sử dụng nó từ Erlang.

at least one pure-Erlang alternative, nhưng tôi không có kinh nghiệm với nó, vì vậy tôi không thể xác nhận cá nhân nó.

+0

Điều này chắc chắn là phải đọc cho bất cứ ai làm số học dấu phẩy động. – rvirding

+0

Cảm ơn bạn đã liên kết – Yola

+0

@WarrenYoung Cảm ơn bạn đã cung cấp thông tin, tôi đã tìm kiếm và tôi đã đề cập đến điều này: https://github.com/tim/erlang-decimal Nhưng tôi không chắc chắn về sự phát triển tích cực, nhưng một số mọi người có dĩa với những thay đổi và tính năng mới. – JHG

8

Tính toán được thực hiện bằng cách sử dụng số học dấu chấm động tiêu chuẩn trên phần cứng của bạn. Đôi khi lỗi làm tròn xuất hiện.

Bạn có thực sự cần 15 chữ số chính xác không?

Để có được một "chính xác" nhiều giá trị hơn có nhiều lựa chọn:

> round(Area). % Will round to integer 
6 

hoặc bạn có thể tròn đến một số chính xác

round(Area * 10000000)/10000000. 
6.0 

Nếu mục đích là để in các giá trị, sau đó in với đầu ra mặc định cho float cho bạn độ chính xác thấp hơn.

io:format("~f~n", [Area]). 
6.000000 
ok 

hoặc với một độ chính xác cụ thể

io:format("~.14f~n", [Area]). 
6.00000000000000 
ok 

HTH