
无法通过进位传播值
在最近尝试用 C 创建大型精度 mpfl 类时,开发人员遇到了添加 0xffffffff 和 0x04 导致 0xffff0003 而不是预期的问题0x0100000003。负责该操作的 add 函数概述如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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;
}
|
登录后复制
虽然该函数的目标是将两个大精度值相加,但它无法正确处理进位传播,从而导致结果不准确。要解决此问题,请考虑以下建议:
-
实现 ALU 架构:使用类似于真实硬件的算术逻辑单元 (ALU) 架构来优化代码。这种方法可以简化计算并提高计算效率。
-
始终应用进位:在 add 函数中,确保除第一次迭代外始终应用进位。在后续加法中应考虑进位,以产生正确的结果。
-
验证数字顺序:确认数字中的数字以正确的顺序存储和处理。通常情况下,应该从最低位到最高位相加。
此外,对于无需汇编的大精度乘法和除法运算,请参考以下链接的纯 C/C 实现:
[在 C 中不使用 Float 构建对数函数类型](https://stackoverflow.com/questions/11762232/building-a-logarithm-function-in-c-without-using-float-type)
以上是为什么这个C大精度加法函数无法正确传播进位?的详细内容。更多信息请关注PHP中文网其他相关文章!