Membawa Isu Penyebaran dalam Penambahan mpfl
Fungsi penambahan mpfl anda menghadapi masalah dengan menyebarkan nilai bawaan dengan betul, mengakibatkan jumlah yang salah. Khususnya, selepas menambah dua nilai 32-bit, jika hasilnya melebihi julat nilai 32-bit tunggal, bit pembawa tidak disebarkan dengan betul, membawa kepada jumlah yang salah.
Pendekatan Senibina
Untuk menyelesaikan isu ini, adalah berfaedah untuk mempertimbangkan ALU (Aritmetik Logik seni bina Unit) serupa dengan yang digunakan dalam pelaksanaan perkakasan. Dengan memodelkan kod anda selepas operasi ALU, anda boleh memudahkan dan meningkatkan ketepatan pengiraan anda.
Membetulkan Kod
Kod berikut menyediakan versi yang disemak fungsi tambahan anda yang menangani isu penyebaran bawa:
mpfl operator+(const mpfl &lhs, const mpfl &rhs) { unsigned long i; mpfl ret(0); mpfl trhs(rhs); ALU32 alu; for (i = lhs.nbytes; i >= 0; i--) { alu.adc(ret.data[i].data, lhs.data[i].data, trhs.data[i].data); if (i < lhs.nbytes) { if (ret.data[i].data == 255 && ret.data[i + 1].carry == 1) increment(&trhs, i + 1); } } return ret; }
Kunci Pengubahsuaian
Atas ialah kandungan terperinci Mengapa Penambahan Titik Terapung Berbilang Ketepatan (mpfl) Saya Gagal Merambat Bit Pembawa Dengan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!