繁体   English   中英

精确双除法

[英]Exact double division

考虑以下 function:

auto f(double a, double b) -> int
{
  return std::floor(a/b);
}

所以我想计算最大的 integer k使得k * b <= a在数学意义上。 由于可能存在舍入误差,我不确定上述 function 是否真的计算了这个k 我不担心k可能超出范围的情况。 确定这个k的正确方法是什么?

除法产生 a/b,精确计算然后四舍五入为有效的双精度数。 如果 a/b >= n 则不能四舍五入到小于 n 的值。 如果 a/b < n,比如说 7.9999999999,那么它可以先验地四舍五入到 8,但是你可以证明 n 永远不是最接近的浮点数。

问题是浮点除法不准确。

a/b可以给出1.9999而不是2 ,然后std::floor可以给出1

一个简单的解决方案是在调用std::floor之前添加一个小值:

std::floor (a/b + 1.0e-10);

结果:

result = 10 while 11 was expected
With eps added, result = 11

测试代码:


#include <iostream>
#include <cmath>

int main () {
    double b = atan (1.0);
    int x = 11;
    double a = x * b;
    int y = std::floor (a/b);
    std::cout << "result = " << y << " while " << x << " was expected\n";
    
    double eps = 1.0e-10;
    int z = std::floor (a/b + eps);
    std::cout << "With eps added, result = " << z << "\n";
    
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM