Rumah > pembangunan bahagian belakang > C++ > Mengapa Fungsi Penambahan Ketepatan Besar C Ini Gagal Merambat Dibawa Dengan Betul?

Mengapa Fungsi Penambahan Ketepatan Besar C Ini Gagal Merambat Dibawa Dengan Betul?

Susan Sarandon
Lepaskan: 2025-01-04 06:55:39
asal
549 orang telah melayarinya

Why Does This C   Large Precision Addition Function Fail to Propagate Carry Correctly?

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;
}
Salin selepas log masuk

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:

  • Laksanakan Seni Bina ALU: Optimumkan kod menggunakan seni bina Unit Logik Aritmetik (ALU) serupa dengan perkakasan sebenar. Pendekatan ini boleh memudahkan dan meningkatkan kecekapan pengiraan.
  • Sentiasa Guna Bawa: Dalam fungsi tambah, pastikan bawa digunakan secara konsisten kecuali untuk lelaran pertama. Bawa harus dipertimbangkan dalam penambahan berikutnya untuk menghasilkan keputusan yang betul.
  • Sahkan Susunan Digit: Sahkan bahawa digit dalam nombor disimpan dan diproses dalam susunan yang betul. Lazimnya, ia perlu ditambah daripada digit paling tidak signifikan kepada digit paling ketara.

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan