Seperti yang mungkin Anda ketahui, Spotlight dapat melakukan matematika sederhana. Misalnya, mengetik cos(pi)
akan menghasilkan -1
, seperti yang Anda harapkan. Saya baru saja mengetik cos(pi/2)
, yang seharusnya 0 tetapi memberi saya -5e-12
.
Ya itu mungkin karena kesalahan pembulatan, tetapi ayolah cos(pi/2)
:! Menurut pendapat saya, itu jelas terlihat seperti bug. Bagaimana menurut anda?
pi
itu sendiri akan menjadi hard-coded (saat Anda mendapatkan -1 untukcos(pi)
) tetapi segera setelah Anda memanipulasinya Anda mendapatkan angka floating point, yang memiliki presisi terbatas. OSX bukan hard-codepi/2
,pi/4
dll, itu benar-benar melakukan operasi.0.1
tepat. tepatnya, tetapi ini tidak berguna untuk bilangan irasional seperti pi yang tidak dapat direpresentasikan secara tepat dalam biner atau desimal.irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
Jawaban:
Ini karena kurangnya presisi pi dan karena keseluruhan semua kurangnya presisi dalam sistem bawaan.
Tentang presisi sistem secara keseluruhan:
Dalam Python kita mendapatkan yang berikut:
Seperti yang bisa kita lihat ada masalah dengan presisi karena bahkan tidak cocok dengan representasi float.
sumber
Mereka tidak menyimpan π dengan presisi floating-point yang tidak biasa. Mereka menggunakan nilai yang salah untuk π dengan presisi ganda. Untuk perkiraan 3,1415926536 dalam biner, setidaknya 38 bit diperlukan:
Perhatikan bahwa 2 ^ -36 adalah tentang 1.5e-11, yang bertepatan dengan trailing 99. floating-point presisi ganda memiliki signifikansi 52-bit. Untuk mengevaluasi
cos(pi/2)
sebagai -5e-12, satu-satunya pilihan lain yang mungkin adalah tipe 48-bit, yang akan sangat aneh.Dekat 0 dan π, di mana turunannya hampir nol, cos (θ) tidak dapat dihitung dengan sangat akurat:
cos(3.1415926536) ≈ -0.999999999999999999999947911
Itu berbeda dari -1 sekitar 5,2e-23, yang lebih kecil dari ε untuk
double
, jadicos(3.1415926536)
dihitung dengan tepat -1 ... yang tidak benar.Dekat ± π / 2, turunan [ -sin (θ) ] hampir ± 1, sehingga kesalahan pada input menjadi output.
Saya kebetulan memiliki kalkulator TI yang menampilkan satu digit lebih sedikit dan menghitung
cos(π/2)
sebagai -5.2e-12. Namun, ini sangat berbeda secara elektronik dan dirancang untuk memberikan nilai tepatcos(90°)
.Saya akan menebak bahwa di Spotlight,
cos(pi/2)
sedang dihitung dengan mengambil nilai untuk π, mengkonversi ke string desimal , menyimpannya sebagai nilai biner (tepat, rasional) 11.0010010000111111011010101000100010010010101010101111 (atau 10000), membaginya dengan 2, dan kemudian pada dasarnya mengurangkan dari nilai sebenarnya dari π / 2. Anda harus mencari tahu apakahcos(pi/2 + cos(pi/2))
lebih dekat ke nol (mungkin -2.2e-35).Perkalian dengan kekuatan dua seharusnya hanya mempengaruhi eksponen, bukan signifikan. Dimungkinkan untuk menentukan bagaimana pembulatan diterapkan dengan membagi dua atau menggandakan.
sumber
Ini adalah bug yang dapat direproduksi pada 10.9.2 - dan kesalahan pembulatan titik mengambang seperti itu cukup tipikal.
Nilai pi yang ditangani tanpa cukup presisi jika saya harus menebak.
Saya akan menuju ke https://developer.apple.com/bug-reporting/ jika Anda ingin melihat aparatur perbaikan bug Apple beraksi.
sumber
cos(2*acos(0)*0.5)
mengembalikan sejumlah pesanan10^-10
. Jadi bukan karena konstanta π tidak cukup tepat. Saya tidak bisa menjelaskan hasil ini: terlalu presisi untuk presisi ganda dan terlalu presisi untuk presisi tunggal.Dari jawaban dan komentar lain yang berikut menjadi jelas:
Fakta bahwa Anda mendapatkan hasil bukan nol BUKAN bug, bahkan dengan implementasi perangkat lunak yang sempurna Anda akan mengalami batasan perhitungan floating point. Namun, kesalahan dalam urutan 10 ^ -12 sangat besar.
Ini BUKAN untuk menyalahkan ketidaktepatan angka floating point. Hasil yang Anda dapatkan hanya ini:
Itu dapat divalidasi menggunakan paket perangkat lunak alternatif apa pun. Jika Anda mengevaluasi
cos(pi/2)
dalam salah satu paket tersebut, Anda pasti akan mendapatkan hasil yang jauh lebih dekat dengan nol dari 10 ^ -12.Untuk menyimpulkan saya melihat dua batasan yang mungkin, salah satunya harus berlaku:
Mungkin seseorang dengan akses ke perangkat lunak dapat memvalidasi mana yang berlaku.
Pembaruan Seperti yang disebutkan dalam komentar masalah tampaknya adalah keakuratan konstanta
pi
.sumber
Menimbang bahwa
-5e-12
ini adalah jumlah yang sangat kecil, ini adalah kesalahan pembulatan.Saya pikir ini adalah konsekuensi dari sorotan yang menunjukkan lebih banyak desimal daripada yang digunakan dalam definisi
pi
konstanta atau deret tak hingga yang digunakan untuk menghitung fungsi trigonometri.sumber