Saya diberitahu bahwa kebanyakan komputer modern mengikuti standar floating point yang sama, apakah ini berarti mereka semua akan mendapatkan jawaban float yang sama untuk operasi matematika yang diberikan jika inputnya sama?
Saya bertanya karena saya sedang meneliti cara membuat game RTS di jaringan, dan menyinkronkan ratusan posisi unit terdengar seperti cara yang buruk.
Jadi jika saya hanya mengirim input saja, saya perlu menjamin semua klien mendapatkan hasil yang sama dengan meminta mereka menjalankan simulasi dari input tersebut.
Saya membaca bahwa game RTS yang lebih lama menggunakan aritmatika titik tetap, tetapi saya tidak tahu apakah itu masih diperlukan pada komputer modern jika semuanya mematuhi standar yang sama? Saya juga diberitahu bahwa meskipun tidak tepat, hasil floating point adalah deterministik untuk input yang sama (yang saya anggap komputer mana pun yang mengikuti standar yang sama mendapatkan hasil yang tidak tepat sama?).
Apakah komputer masih memiliki penyimpangan bahkan jika mereka mengikuti standar float point yang sama?
Saya menulis game ini di C # tidak yakin apakah itu penting, saya pikir saya akan menyebutkannya.
sumber
Jawaban:
Sayangnya, ya, terutama ketika Anda menggunakan C # (atau bahasa kompilasi JIT lain). Masalah yang terjadi di sini adalah bahwa tahap kompilasi JIT pada beberapa arsitektur prosesor menghasilkan kode yang menggunakan lebih banyak register CPU daripada pada arsitektur lain. Ini dapat menyebabkan situasi di mana pada beberapa mesin, presisi floating point yang diperluas digunakan untuk operasi tertentu, sedangkan pada mesin lain tidak. Ini berarti untuk setiap perhitungan berulang menggunakan ganda, ada kemungkinan untuk menghasilkan kesalahan pembulatan akumulasi yang berbeda.
Itu bukan masalah hipotetis, saya memiliki pengalaman langsung dengan penyimpangan dalam perangkat lunak simulasi rekayasa kontemporer, pada perangkat keras yang kurang lebih modern. Masalah ini membuatnya sangat sulit untuk membuat tes regresi yang andal untuk perhitungan floating point kompleks yang menghasilkan hasil yang persis sama pada semua mesin yang terlibat.
sumber
FLT_EVAL_METHOD
dalam ISO C / C ++. Fungsi transendental (missin
.exp
,log
) Sebagian besar tidak diatur oleh standar titik-mengambang IEEE dan standar bahasa pemrograman. Pemutakhiran versi pustaka sederhana (mis.glibc
Versi baru ) dapat menyebabkan hasil yang berbeda.Kesalahan Floating Point
Setiap angka floating point mengakumulasi ketidaktepatan karena digunakan untuk perhitungan. Ini adalah fakta sederhana menggunakan format yang tidak tepat untuk menghitung. Perhitungan juga sensitif terhadap urutan perhitungan, komutatifitas tidak dijamin, yaitu:
(a + b) + c
mungkin atau mungkin tidak sama dengana + (b + c)
.Selain itu prosesor tidak harus memiliki panjang mantissa yang sama dengan standar memori. Ini dapat menghasilkan perilaku yang menarik karena float 32/64/128 sesekali beroperasi seolah-olah mereka memiliki lebih banyak bit.
Memperbaiki Kesalahan Poin
Itu dikatakan titik tetap aritmatika juga dapat mengakumulasi kesalahan. Perbedaannya adalah bahwa angka-angka titik tetap jelas tentang presisi yang hilang, dan tergantung pada operasi yang dipilih dapat menghindari kesalahan pembulatan sama sekali. Mereka juga komutatif
(a + b) + c = a + (b + c)
.Yang?
Yang mana untuk digunakan tergantung sepenuhnya pada properti apa yang Anda butuhkan.
Nomor titik mengambang:
Nomor Poin Tetap:
sumber
(a + b * c) / d - e
. Kecuali masalah yang jelas sepertiNaN
, pembagian dengan nol, atau overflow / underflow adalah mungkin untuk ungkapan ini tidak benar. Tambahkan ke bahwa impedansi antara memori dan mendaftar dalam hal presisi dan bahkan memuat / menyimpan sederhana dari memori dari nilai floating point yang "sama" akan mengubah jawabannya.Ada pertanyaan mengapa Anda ingin menjamin hasil yang identik, karena hasil yang sama tidak memberikan jaminan sama sekali bahwa hasil Anda bermanfaat .
Anda dapat memiliki algoritma yang tidak stabil secara numerik yang memberikan dua hasil yang identik tetapi sama sekali tidak masuk akal di komputer yang berbeda. Jika ada perbedaan, tetapi hasilnya sama dalam 13 digit, itu jauh lebih dapat dipercaya.
Ada beberapa situasi di mana reproduksibilitas sangat penting: dalam mesin tata letak, atau kompresi / dekompresi lossless. Menggunakan titik tetap sangat mungkin salah arah.
sumber