在我之前的问题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,而不是小于。
答案 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。这是好值得一读。
参考您的特定问题,标准方法是定义容差,使用该容差进行双打比较。例如,如果您有两个双打a
和b
,并且希望确定a
是否大于b
,且容差为eps
(另一个双倍) ,你可以这样做:
if (a - b > eps) {
// a is greater than b
} else {
// a is not greater than b
}
或者,如果您想知道a
在b
指定的容差范围内等于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::abs,std::numeric_limits和this 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位精度。