无法通过进位传播值
在最近尝试用 C 创建大型精度 mpfl 类时,开发人员遇到了添加 0xffffffff 和 0x04 导致 0xffff0003 而不是预期的问题0x0100000003。负责该操作的 add 函数概述如下:
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; }
虽然该函数的目标是将两个大精度值相加,但它无法正确处理进位传播,从而导致结果不准确。要解决此问题,请考虑以下建议:
此外,对于无需汇编的大精度乘法和除法运算,请参考以下链接的纯 C/C 实现:
[在 C 中不使用 Float 构建对数函数类型](https://stackoverflow.com/questions/11762232/building-a-logarithm-function-in-c-without-using-float-type)
以上是为什么这个C大精度加法函数无法正确传播进位?的详细内容。更多信息请关注PHP中文网其他相关文章!