if (abs (a-b) < EPS) . . .
Mereka secara naif memilih angka 1e-8 yang sama untuk semua proyek mereka, menciptakan tempat potensial untuk kesalahan parah. Apalagi, mereka mencoba membandingkan dua ganda seperti ini:
if (a < b) . . .
tidak mengerti mengapa saya memarahi mereka ketika saya melihat omong kosong seperti itu. Saya bahkan tidak berbicara tentang kengerian apa yang dapat disebabkan oleh konstanta seperti 0x400921fb54442d18 (hanya angka) yang dapat dilihat di beberapa program lama atau di layar debugger.

Setelah dalam proses debugging, seorang kolega menemukan bahwa ekspresi dengan double tidak berubah ketika dia mencoba menambahkan dua angka, dan kemudian dia mulai melakukan kesalahan dalam kompilator atau debugger, sampai saya menjelaskan dalam kasus apa jumlah dua angka akan tetap sama dengan hanya satu dari istilah ...
Trik pertukaran nomor juga menakutkan bagi banyak orang, dan di StackOverflow saya sering melihat pertanyaan yang membingungkan dari pengguna tentang mengapa perubahan kecil dalam ekspresi mengarah ke hasil yang berbeda dan mengapa pengoptimalan kode dapat mengarah pada jawaban yang sepenuhnya salah. Suatu ketika, salah satu pengguna dengan tegas menyatakan bahwa dia menemukan kesalahan dalam prosesor ketika dia mengubah bilangan bulat dari 64 bit menjadi angka presisi ganda, lalu kembali - dan mendapatkan nomor lain. Dia tampaknya tidak tahu bagaimana setidaknya 11 bit hilang dengan konversi seperti itu. Dan ketidaktahuan seperti itu ditemukan bahkan di antara mereka yang yakin bahwa dia hanya tahu bagaimana segala sesuatu bekerja.
Bahkan di Habré, sering kali ada artikel di mana penulis "mengekspos" perilaku bilangan floating point yang tidak dapat dipahami dan menyampaikan penemuan mereka sebagai sesuatu yang baru dan tidak diketahui, tidak jelas dan misterius. Sungguh aneh melihat artikel seperti itu ditulis oleh programmer yang tampaknya profesional. Saya tidak akan mempublikasikannya, silakan cari sendiri.
Tampaknya berbagai materi pelatihan seharusnya menyelesaikan masalah, tetapi tidak. Sebagai aturan, pembaca ditakuti oleh rumus dan kata-kata yang tidak bisa dipahami, yang segera dilontarkan penulis kepadanya: bilangan normal , unit tersembunyi , eksponen bias- dan kemudian, tanpa menjelaskan alasan mengapa solusi tertentu muncul dalam Standar IEEE-754, presentasi teori dimulai. Video ceramah tentang topik ini juga tidak bersinar dengan variasi: semua orang tampaknya menganalisis contoh primitif yang sama, di mana semuanya berubah dengan cepat dan indah ... dan siswa tidak akan pernah menebak bahwa hampir 100% penyusun bekerja dengan aritmatika mengambang dengan kesalahan. Hal ini dapat dimaklumi, guru seperti itu sendiri tidak tahu dari mana asalnya dan bagaimana cara kerjanya, dan oleh karena itu hanya menceritakan apa yang mereka sendiri pahami, dan cukup jelas bahwa mereka sendiri baru kemarin menemukan dunia aritmatika floating point, tetapi mereka sudah terburu-buru bingung ceritakan tentang dia. Saya tidak menilai, tetapi menurut saya perilaku seperti itu di depan umum tidak dapat diterima.
Jadi saya memutuskan untuk mencoba memperbaiki situasi dan menciptakan dalam artipercobaankursus pelatihan. Ini adalah kursus video yang dengan lancar membenamkan pemirsa ke dalam dunia aritmatika titik mengambang. Empat pelajaran pertama kita melihat sistem bilangan desimal dan bagaimana keadaan memaksa kita untuk membuat satu atau beberapa sistem bilangan, akhirnya sampai pada sistem floating point dalam bentuk ini. Dari mana asal normalisasi dan mengapa itu diperlukan? Dari mana asalnya masalah asosiatif? Bagaimana dan mengapa akurasi hilang dan apa yang harus dilakukan? Apa yang benar-benar dilarang untuk dilakukan dan mengapa? Mengapa angka yang dinormalisasi muncul dalam sistem seperti itu dan tentang apa itu semua? Kemudian 4 pelajaran berikutnya menunjukkan bagaimana semua pengetahuan ini cocok dengan baik ke dalam aritmatika biner dan dari mana ide bit tersembunyi itu berasal. Saat "formula mengerikan" pertama muncul di layar,penonton sudah memiliki gambar aritmatika floating point yang diperlukan di kepalanya dan dengan mudah memahami logika rumus seperti itu ... tentu saja, jika dia melakukan latihan dengan benar. Semua 8 pelajaran ini adalah bagian pertama dari kursus, ini untuk pemula. Yang kedua untuk programmer tingkat lanjut dan saat ini sedang dalam pengembangan.
Mengapa video dan bukan teks? Penjelasannya sederhana: Saya sudah mencoba format yang berbeda dan merasa sulit bagi pemula untuk membaca. Siapapun yang tahu bagaimana membaca dengan seksama akan membuka buku teks dan membaca teks dengan rumus, mengerti dan mengerti. Bagi mereka yang merasa sulit membaca, yang takut dengan hal-hal yang sulit dan yang merasa lebih mudah mempelajari materi sambil minum teh, perendaman yang lancar dalam format video dengan sulih suara cocok. Banyak air? Ya, itu mungkin, tetapi kursus ini dirancang bahkan untuk orang-orang yang ingin membuat program, tetapi tidak berteman dengan matematika di sekolah. Oleh karena itu, yang "air" untuk Anda bukanlah air, tetapi apa yang Anda sudah ketahui dengan baik dari sekolah, dan banyak siswa saya tidak. Bersikaplah merendahkan mereka, kita semua mulai dari suatu tempat. Dan video itu juga bisa dilihat sebagai persiapan untuk membaca buku teks yang serius. Setuju, alangkah baiknya jika Anda membuka buku teks dan memahami apa yang tertulis di dalamnya lebih cepat,karena gambar yang diinginkan sudah ada di kepala.
Tentang saya: sebelumnya seorang guru profesional, 11 tahun bekerja di universitas, mengajar matematika dan pemrograman, dalam beberapa tahun terakhir saya telah mengembangkan perpustakaan matematika untuk komputasi performa tinggi. Saya memahami dengan baik apa yang diinginkan audiens target saya, dan saya sangat memahami apa yang dibutuhkan tentang topik ini di dunia pemrograman, dan oleh karena itu saya percaya bahwa saya memiliki hak untuk membuat kursus seperti itu, dan Anda dapat melihat sendiri bahwa kualitas (dalam hal konten ) serupa dalam kuliah di Anda tidak akan menemukan bahasa Rusia sekarang. Saksikan berikut ini! Empat pelajaran pertama, dari mana Anda akan sudah belajar banyak hal menarik, benar-benar bebas. Jika Anda suka, Anda dapat membahas sisanya, mereka bahkan lebih menarik, tetapi dengan biaya tertentu. Pekerjaan orang lain harus dihormati: Saya tidakSaya menjual pengetahuan, tetapi saya membutuhkan dukungan untuk melanjutkan pekerjaan pendidikan saya, jadi waktu saya bernilai uang. Secara umum, Anda dapat menarik kesimpulan tentang kualitas pekerjaan saya dari artikel saya yang lain di Habré.
Bagi yang akan bergabung dengan komunitas VK kami , saya dapat memberikan diskon 50% jika Anda menghubungi PM. Silakan mendaftar di ZealComputing School (gratis) dan tonton 4 pelajaran pertama. Atau mereka ada di YouTube (yang pertama ada di sini - dan selanjutnya di tautan dari deskripsi). Iya tidak perlu nonton video pengantar yang saya link, itu hanya iklan.
Ringkasan pelajaran berbayar
Pelajaran # 5 : Mari beralih ke sistem bilangan biner untuk pertama kalinya. Kami membuat model floating point 6-bit yang indah dan sederhana yang sangat mirip dengan format IEEE-754. Ini adalah pelajaran yang paling penting dan paling sulit. Empat pelajaran sebelumnya dirancang untuk menunjukkan dari mana hal-hal tertentu berasal dalam aritmatika floating point, dan sekarang Anda memahami bagaimana hal-hal ini muncul dengan indah dalam format IEEE-754 menggunakan mainan dan contoh yang dapat dimengerti.
Pelajaran nomor 6: Memperkenalkan pembulatan. Ini tidak sejelas dalam matematika biasa. Anda akan mempelajari apa yang sulit dilihat dalam contoh paling sederhana yang diberikan oleh guru video lainnya. Yaitu: terkadang sulit untuk mengonversi bilangan dari sistem bilangan desimal ke format IEEE-754 sehingga beberapa kompiler tidak dapat melakukannya dengan benar. Saya akan menjelaskan secara rinci mengapa semuanya begitu sederhana secara teori, tetapi tidak dalam praktiknya.
Pelajaran nomor 7: Di sini Anda sepenuhnya menguasai format binary32 dan binary64 (float dan double), tunjukkan bagaimana Anda dapat menampilkan representasi bit angka dalam C ++ (dalam bahasa lain juga dimungkinkan, tetapi tidak secara keseluruhan, saya merujuk Anda ke Google atau Yandex dan menunjukkan betapa sederhananya, misalnya, temukan solusi Java). Setelah pelajaran ini, struktur bilangan floating point (jika Anda melakukan latihan dengan baik) menjadi jelas sepenuhnya bagi Anda dan tidak dapat mengajukan pertanyaan yang tidak dijawab di pelajaran sebelumnya.
Pelajaran nomor 8: Panduan praktis untuk menggunakan aritmatika floating point. Beberapa fitur yang sudah dijelaskan dan poin baru: hilangnya komutativitas, asosiatif, manifestasi tak terduga dari apa yang disebut "keseimbangan batin". Dan tip terpenting! Nasihat ini akan membantu Anda menghindari hampir 100% dari semua kesalahan dalam tugas-tugas tidak kritis yang umum. Berikutnya adalah pembahasan tentang kesalahan pembulatan ganda, kehilangan bencana dari angka-angka penting: kapan dan bagaimana hal itu terjadi. Secara umum, semua praktik sederhana yang tidak memerlukan matematika tingkat lanjut dijelaskan dalam pelajaran ini.
Apa lagi yang termasuk dalam kursus ini? Dan tidak ada lagi yang dibutuhkan! Anda dapat mengajukan pertanyaan kepada saya tentang pelajaran, tetapi saya yakin itu tidak akan muncul. Setiap pelajaran berisi latihan komprehensif dengan jawaban, jadi partisipasi saya secara umum tidak diperlukan, karenanya harganya murah. Kursus penuh dengan instruktur, komunikasi, lokakarya yang dibimbing, dan kuliah langsung akan menelan biaya sepuluh kali lebih banyak.
Selamat belajar!