[英]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.