【问题标题】:How to avoid integer overflow in case of pow function in division with a number?在 pow 函数与数字除法的情况下如何避免整数溢出?
【发布时间】:2016-02-14 04:49:20
【问题描述】:

我有以下声明。

d = (pow(a,2*l+1)+1)/(val+1);  

这里,

  • valal 是与问题无关的变量。
  • 分子可以超出 long long int 范围。
  • 分母是分子的除数。

但最终的答案 d 肯定会在long long int 范围内。如何在不损失准确性的情况下计算d?我更喜欢一个答案,而不是将它们转换为数组并使用小学乘法和除法。

【问题讨论】:

  • 您应该说出您的目标语言。我猜是 c 或 c++。
  • pow for c 和 c++ 都返回浮点数 std::pow,取决于输入类型,您将得到 long double 作为输出,因此超过 long long 不应该是问题,关于 overflow,但您肯定可能或将会失去准确性,但根据用例,这可能仍然是可以接受的。如果这是不可接受的,那么您需要使用像 GNU GMP 这样的库。
  • 我不能不准确。我的代码对分子可以达到 10^21 的大数的计算给出了错误的答案。有没有不丢失任何准确性的方法?已知分母将始终将分子除以没有余数
  • [...]My code gives wrong answer for calculation on large numbers[...] 你需要解释为什么会得到或者你认为你会得到错误的结果(例如,用浮点数进行== 测试永远不会像预期的那样工作)。否则,唯一的答案是没有办法绕过大数字库。
  • 你怎么知道你的计算器没有错?当你说你的评委时,这是否意味着你提交这个是为了某种编程竞赛?

标签: c++ math integer-overflow arithmetic-expressions integer-arithmetic


【解决方案1】:

我现在没有时间写一个正确的答案;如果有机会,我稍后会扩展它。基本思想是使用小学算法,使用作为分母力量的“数字”。在 Google 上搜索“Schrage 乘法”或查看 here 以获取参考。

【讨论】:

  • 从标题中,您链接的算法用于 模运算 而不是除法结果,还是可以修改? (懒得分析,因为我以不同的方式处理这些任务,但你应该澄清一下,以免混淆其他人)
【解决方案2】:

我希望操作数也是整数

  1. 我会通过平方而不是 pow 来使用权力

    Integer power by squaring

  2. 在迭代 #1 时

    每个时间间的子结果和分母都可以被 2 整除,以保持 pow 结果小且不损失精度或结果的正确性。所以每次子结果和分母的 LSB 位都是零时都右移 1 位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多