Tidak Dapat Membuat Nilai Disebarkan Melalui Carry
Dalam percubaan baru-baru ini untuk mencipta kelas mpfl ketepatan besar dalam C , pembangun menghadapi isu di mana penambahan 0xffffffff dan 0x04 menghasilkan 0xffff0003 dan bukannya yang dijangkakan 0x0100000003. Fungsi tambah yang bertanggungjawab untuk operasi digariskan di bawah:
mpfl operator+(const mpfl &lhs, const mpfl &rhs) { unsigned long i; mpfl ret(0); mpfl trhs(rhs); for (i = lhs.nbytes; i >= 0; i--) { if ( (unsigned short)lhs.data[i].data + (unsigned short)trhs.data[i].data > (unsigned short)255 ) { if (i > 0) { ret.data[i].carry = 1; ret.data[0].carry = 0; } else { ret.data[0].carry = 1; } } else ret.data[i].carry = 0; 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); ret.data[i].data += ret.data[i + 1].carry; } if (i == 0) break; } return ret; }
Walaupun matlamat fungsi ini adalah untuk menambah dua nilai ketepatan yang besar, ia gagal mengendalikan perambatan pembawa dengan betul, yang membawa kepada keputusan yang tidak tepat. Untuk menangani isu ini, pertimbangkan cadangan berikut:
Selain itu, untuk operasi pendaraban dan pembahagian ketepatan besar tanpa pemasangan, rujuk pautan berikut untuk pelaksanaan C/C tulen :
[Membina Fungsi Logaritma dalam C Tanpa Menggunakan Float Taip](https://stackoverflow.com/questions/11762232/building-a-logarithm-function-in-c-without-using-float-type)
Atas ialah kandungan terperinci Mengapa Fungsi Penambahan Ketepatan Besar C Ini Gagal Merambat Dibawa Dengan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!