可变比特浮点数的乘除算法实现技术问询
大浮点数
divideBinaryVectors实现问题排查与修复思路 问题背景
- 正在开发支持大整数与大浮点数的
BigNumber库,已实现BigFloating和BigInteger的加减运算、BigInteger的乘除运算,需完成可变比特浮点数的乘除算法 - 浮点数比特以
std::vector<bool>存储,格式为:符号位(1bit)|整数部分(可变比特)|小数部分(可变比特),例如数字5.5的比特为0 101 1 - 已完成
multiplyBits函数实现(代码如下),但divideBits依赖的divideBinaryVectors在5 / 0.27、10 / 100等测试用例中失败
std::tuple<std::vector<bool>, size_t, size_t> BigCommon::multiplyBits(const std::vector<bool> &lhsBits, const std::vector<bool> &rhsBits, const size_t &integerBitsSize, const size_t &mantissaBitsSize) { std::vector<bool> result; result.insert(result.begin(), lhsBits[0] ^ rhsBits[0]); size_t newIntegerBitsSize = 0; size_t newMantissaBitsSize = mantissaBitsSize + mantissaBitsSize; std::vector<bool> lhsBinary(lhsBits.begin() + 1, lhsBits.end()); std::vector<bool> rhsBinary(rhsBits.begin() + 1, rhsBits.end()); std::vector<bool> multResult = multiplyBinaryVectors(lhsBinary, rhsBinary); newIntegerBitsSize = multResult.size() - newMantissaBitsSize; result.insert(result.begin() + 1, multResult.begin(), multResult.end()); return {result, newIntegerBitsSize, newMantissaBitsSize}; };
可能的问题点与修复方向
1. 二进制除法的精度截断与对齐错误
浮点数除法需处理整数与小数部分的对齐,尤其是被除数小于除数的场景(如10/100=0.1):
- 检查
divideBinaryVectors是否在被除数位数不足时正确补零,确保小数部分能生成足够有效比特 - 确认除法结束后,是否按
mantissaBitsSize要求完成截断或舍入,避免精度丢失导致结果偏差
2. 整数/小数位拆分逻辑错误
在divideBits中需正确拆分操作数的符号位、整数与小数部分:
- 验证从
lhsBits/rhsBits拆分整数部分时,是否严格按照integerBitsSize的长度截取,避免位数计算错误 - 确认符号位处理为异或操作(同号为正、异号为负),且结果符号位设置正确
3. 无限循环二进制小数的处理缺陷
针对5/0.27这类无法用有限二进制小数表示的场景,需处理循环比特的截断与舍入:
- 检查
divideBinaryVectors是否设置了最大迭代次数,避免无限循环;同时确认截断时采用的舍入规则(如四舍五入、截断)符合预期 - 验证纯小数操作数的处理逻辑,例如0.27的二进制为无限循环小数,需确保除法过程中保留足够中间精度
4. 输入二进制序列的正确性验证
先手动确认测试用例的二进制转换是否正确:
- 5的二进制整数部分为
101,小数部分为空;0.27的二进制小数部分为0.01000101000111101011100001010001...(循环) - 10的二进制为
1010,100的二进制为1100100,10/100=0.1的二进制为0.0001100110011...(循环) - 确认
divideBinaryVectors的输入二进制序列与预期一致,排除预处理阶段的错误
调试建议
- 在
divideBinaryVectors中添加日志,输出每一步的被除数、除数、商比特、余数,对比手动计算的二进制除法步骤,定位错误环节 - 单独测试
divideBinaryVectors的基础用例,如1010(10)除以1100100(100),验证输出的商二进制是否符合预期的0.000110011...
内容的提问来源于stack exchange,提问作者ZeunO8
相关产品推荐
相关产品推荐

