無法透過進位傳播值
在最近嘗試用C 創建大型精度mpfl 類別時,開發人員遇到了添加0xffffff 和0xffffff 和0x04ff 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中文網其他相關文章!