C语言实现任意精度除法,任意精度整数除法,如何处理32位余数?

Brendan..

5

那个算法太可怕了。

第一步应该是确定结果的符号(从分子和除数的符号开始);然后找到分子和除数的大小(并为“分子为0”和“ abs(除数)为0或1”的捷径,在这种情况下,实际上可以避免或不可能进行除法操作),以便执行实际的除法仅处理正数。

第二步应该是确定除数是否小到足以容纳一位数字(数字的基数是您的语言/环境支持的最大底数-例如,对于32位整数的C,它可能是“基数” 65536”,对于64位80x86汇编语言(可以在其中使用128位分子),它可能是“ base 18446744073709551616”。此时,您将转到两种完全不同的算法之一。

小除数

这是一个相对琐碎的“对于分子中的每个数字{用数字除以除数以找到结果中的数字}”循环(之后是确定开始时确定的结果的符号)。

大除数

为此,我将使用二进制除法。想法是左右移动分子和除数,以便除数尽可能大而不会大于分子。然后从分子中减去除数,并在结果中设置与向左/向右移动多少对应的位;并重复此操作,以便(在初始移位之后)最终变成“将分子的任何剩余部分向左移位;然后与除数比较,如果分子大于除数,则从分子中减去除数并在结果中设置位”当分子没有剩余时终止。

离题替代

在大多数情况下,您需要任意精度的除法;最好使用有理数,其中每个数都存储为三个(任意大小的)整数-分子,除数和指数(如number = numerator/divisor * (1 << exponent))。在这种情况下,您不需要除法-您只需乘以倒数。这样可以提高性能,但也可以显着提高精度(例如,您可以计算(1/3) * 6并保证不会有精度损失)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值