You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

可变比特浮点数的乘除算法实现技术问询

大浮点数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:35:39