Pertanyaan Presisi di Erlang


Kode selanjutnya memberi saya 5.999999999999998 di Hasil, tetapi jawaban yang benar adalah 6.

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

Apakah mungkin untuk mendapatkan 6?


6
2017-10-05 14:24


asal


Jawaban:


Anda telah mengalami masalah yang sangat umum sehingga memiliki situs web sendiri, Apa Yang Harus Diketahui Setiap Programmer Tentang Aritmatika Titik-Mengambang. Masalahnya adalah karena cara aritmatika floating-point bekerja di hampir setiap CPU di pasar yang mendukung aritmatika FP; itu tidak khusus untuk Erlang.

Jika aritmatika floating point reguler tidak memberi Anda ketepatan atau akurasi yang Anda butuhkan, Anda dapat menggunakan pustaka aritmatika presisi arbitrer, bukan aritmetika built-in. Mungkin perpustakaan yang paling terkenal adalah GMP, tetapi Anda harus membungkusnya NIF untuk menggunakannya dari Erlang.

Ada setidaknya satu alternatif Erlang murni, tetapi saya tidak memiliki pengalaman dengannya, jadi saya tidak dapat secara pribadi mendukungnya.


23
2017-10-05 15:21



Perhitungan dilakukan menggunakan aritmatika floating point standar pada perangkat keras Anda. Terkadang kesalahan pembulatan muncul.

Apakah Anda benar-benar membutuhkan 15 digit presisi?

Untuk mendapatkan nilai yang lebih "tepat" ada beberapa opsi:

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

atau Anda bisa membulatkan ke beberapa presisi

round(Area * 10000000) / 10000000.
6.0

Jika tujuannya adalah untuk mencetak nilai, lalu mencetak dengan output default untuk pelampung memberikan Anda kurang presisi.

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

atau dengan ketelitian tertentu

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

HTH


8
2017-10-05 14:52