如何在C ++中使用double / float类型时设置精度

时间:2012-05-02 19:35:10

标签: c++ double precision

在我之前的问题Comparing a double and int, without casting or conversion中,我发现两个双打之间的区别是如何绊倒比较。

我遇到了方法setprecision(),它将帮助显示小数点后的所有数字。

因此,发现6.15和3.15的差异为:3.00000000000000044408920985006

现在,当它与3进行比较时,它会返回一个结果,表明它大于3。

如何强制它仅使用有限数量的数字?

当我使用6.1和3.1时,差异是:2.99999999999999955591079014994

我应该如何制作精度,以便我们知道它实际上等于3,而不是小于。

5 个答案:

答案 0 :(得分:4)

希望您应该知道浮点/双精度不能用二进制精确表示,并且由于重复的十进制而发生截断。与带整数的float / double进行比较将始终失败。

即使你的使用setprecision也行不通,因为它是一个iomanip方法来设置显示的精度,而不是存储的值。

比较双打的便携方式不是使用'=='运算符,而是执行类似

的操作
bool Compare(double a,double b) {
    std::fabs(a - b) < std::numeric_limits<double>::epsilon();
}

您可以使用它来比较double和float和或整数。您也可以为float

编写类似的比较函数
bool Compare(float a,float b) {
    std::fabs(a - b) < std::numeric_limits<float>::epsilon();
}

答案 1 :(得分:3)

在对您的其他问题的评论中,您已经在浮点数上指向this great paper。这是值得一读。

参考您的特定问题,标准方法是定义容差,使用该容差进行双打比较。例如,如果您有两个双打ab,并且希望确定a是否大于b,且容差为eps(另一个双倍) ,你可以这样做:

if (a - b > eps) {
  // a is greater than b
} else {
  // a is not greater than b
}

或者,如果您想知道ab指定的容差范围内等于eps,您可以执行以下操作:

if (std::abs(a - b) <= eps) {
  // a and b are equal within the set tolerance
} else {
  // a and b are not equal within the set tolerance
}

正如其他人所指出的,C ++提供了一些开箱即用的有用功能,可用于执行这些类型的比较。在SO上查看std::absstd::numeric_limitsthis nice post

答案 2 :(得分:2)

这是一个比较函数,用于确定两个数字是否在彼此的一个LSB​​内。

bool Compare(double a, double b)
{
    return (a <= std::nextafter(b, abs(1.1*b))) && (b <= std::nextafter(a, abs(1.1*a)));
}

std::nextafter是C ++ 11的新功能,但早期编译器中提供了版本。见Generate next largest or smallest representable floating point number without bit twiddling

答案 3 :(得分:1)

setprecision可让您选择向流中吐出的位数。它不决定要考虑的位数。对于舍入目的,请使用<cmath>中的一个舍入函数。

答案 4 :(得分:0)

float和double中精度的数字实际上分别取决于它们的大小。这就是为什么float通常精度低于double的原因。 你可以使用

    std::cout<<std::setprecision(desired no);

    float a=(desired no);

现在你已经成功地设置了float的精度。对于其他适当的数据类型也可以这样做,包括double。 警告不要将精度设置为大于数据类型所提供的精度.Double具有15到18位精度,而float只有6到9位精度。