使用`floor`时的数值精度

时间:2018-09-15 10:42:25

标签: c++ precision

编辑:有人将此问题标记为典型的“为什么0.1 + 0.3返回0.40000000001?”的重复项,但请注意我不是在问为什么 发生这种情况;我完全意识到这一点。我只是想知道在无法舍入的情况下,是否存在以下情况的解决方法。


编写下面的noDigits函数时,应该在给定某个n的情况下返回整数base的位数,

#include <math.h>
using namespace std;

int noDigits(int n, int base = 10) {
    return (n != 0) ? int(floor(log(abs(n)) / log(base)) + 1) : 1;
}

我遇到了以下精度问题:如果我打印出log(abs(1000))/log(10),我会得到3,但是当我将floor应用于它(即floor(log(abs(1000))/log(10)))时,我会得到2

我猜想这是由于log(abs(1000))/log(10)被存储为2.9999999[...]之类的东西,但是我不确定如何解决它。在某些情况下,log(abs(n))/log(base)实际上类似于2.9987456[...],因此舍入到一定精度是不可行的。

我该如何克服?

澄清:虽然有许多简单的替代方法可以解决此特定问题,但我想问是否存在使用floor(或int转换)的一般解决方法-似乎没有。

0 个答案:

没有答案