[英]Why does std::cout not print values from union, but printf does?
[英]Why does std::cout print 4.9999999 as 5?
我正在使用以下代码找出log(3)
和log10(3)
之间的区别:
void testPrecisionError() {
cout
<< log(243) / log(3) << " : "
<< int(log(243) / log(3)) << " : "
<< endl;
cout
<< log10(243) / log10(3) << " : "
<< int(log10(243) / log10(3)) << " : ")
<< endl;
}
输出为:
5 : 4 // I think it is 4.999999 underlying
5 : 5
我发现4.999999
被打印为5
。
为什么C ++不像Java那样将其打印为4.99999
?
我想我可以不再cout
说服自己,没有精密度的损失!
因为它四舍五入到所请求精度的最后一位数字的最近值。 实际值约为:
4.99999999999999911182158029987
精度为6位数字,比4.999999
接近5.000000
,因此显示5
。 如果使用setprecision(16)
或更高版本,则会看到所有9。
当您强制转换为int
,它总是会被截断,不会舍入到最接近的值。
至于为什么Java将其显示为4.999999
,也许它只是丢弃多余的数字而不是舍入。
欢迎来到不能正确表示实数的二进制世界! double
和float
具有精度问题。 因此,在比较2个double
值等时,您需要格外小心。
例如:
sqrt(2) = [real value of sqrt(2)] +/- [precision error]
iostream中的浮点输出受流的精度控制 。 默认的IIRC是小数点右边的6位。 如果第7位数字为9,则将第6位数字四舍五入,依此类推。 您的情况是4.9999999 ...变成5。
IEEE 754中可能使用的最大十进制精度约为15个小数位。 如果将流的精度设置为16左右(使用setprecision机械手),则将看到“所有”数字。 但是,当然,这仍然只是一个近似值,因为那是什么浮点数。
为什么它不像Java? 两种语言,两组规则。 我认为Java是错误的:如果第7位为9,则4.99999被0.0000009+所抵消,而5.0仅被0.0000001+所抵消。 您想要更多的数字还是更近似的数字?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.