Matlamat anda ialah untuk melaksanakan kelas ketepatan yang besar dalam C , dan anda telah menghadapi masalah semasa menambah nombor bersama-sama. Apabila anda menambah 0xffffffff dan 0x04, anda akan mendapat 0xffff0003 dan bukannya 0x0100000003 yang dijangkakan.
Bahagian yang diserlahkan pada kod anda ialah:
if (i < lhs.nbytes) { if (ret.data[i].data == 255 && ret.data[i + 1].carry == 1) increment(&trhs, i + 1); ret.data[i].data += ret.data[i + 1].carry; }
Here mengapa ia menyebabkan perkara yang tidak betul hasil:
Carry Propagation: Dalam setiap lelaran gelung, bawaan daripada penambahan sebelumnya harus ditambah kepada hasil semasa. Walau bagaimanapun, kod ini hanya menggunakan bawa jika ret.data[i].data ialah 255 dan ret.data[i 1].carry ialah 1. Ini bermakna bawaan tidak selalu disebarkan, yang mengakibatkan jawapan yang salah.
Tertib Storan Tidak Betul: Kelas mpfl nampaknya menyimpan nombor dalam format little-endian, di mana bait paling tidak ketara disimpan dalam bait tertinggi indeks. Ini bukan cara yang diutamakan untuk menyimpan nombor untuk penambahan kerana ia menyukarkan proses penghantaran daripada bait tertib lebih tinggi.
Untuk menyelesaikan isu ini, pertimbangkan pengesyoran berikut:
Atas ialah kandungan terperinci Mengapa Penambahan Ketepatan Besar C Saya Tidak Merambat Membawa Bit dengan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!