cout << sinf(M_PI) << ", " << cosf(M_PI/2);
返回-8.74228e-08, -4.37114e-08处理这个问题最聪明的方法是什么?我已经发现,PI舍入到的小数位数越少,函数返回的结果就越接近正确值。
-8.74228e-08, -4.37114e-08
float pi = 3.14; cout << sinf(pi) << ", " << cosf(pi/2);
退货:
0.00159255, 0.000796274
但是有没有一种方法可以最大限度地提高准确性,而不消除小数位?
kr98yfug1#
数字8.74228e-08小于百万分之一;这是一个比0.00159255小得多的数。2单精度浮点数只能给予你7个有效数字的精度,所以就32位浮点数而言,这基本上是零。通常,浮点数的值可能与您根据所执行的计算所期望的值不完全相同。与某些数学运算的真实结果相比,浮点计算存在少量误差的情况并不罕见。除了精度误差之外,某些数字(即使具有不重复的小数展开)根本无法用浮点数准确表示。π显然不能用十进制的形式来开始。如果要显示浮点数,但不希望在输出中使用科学记数法,请使用std::setprecision。使用浮点数时,切勿测试它们是否与精确值相等。测试它们与精确值之差的绝对值是否小于公差(通常称为epsilon)。
std::setprecision
1条答案
按热度按时间kr98yfug1#
数字8.74228e-08小于百万分之一;这是一个比0.00159255小得多的数。2单精度浮点数只能给予你7个有效数字的精度,所以就32位浮点数而言,这基本上是零。
通常,浮点数的值可能与您根据所执行的计算所期望的值不完全相同。与某些数学运算的真实结果相比,浮点计算存在少量误差的情况并不罕见。除了精度误差之外,某些数字(即使具有不重复的小数展开)根本无法用浮点数准确表示。π显然不能用十进制的形式来开始。
如果要显示浮点数,但不希望在输出中使用科学记数法,请使用
std::setprecision
。使用浮点数时,切勿测试它们是否与精确值相等。测试它们与精确值之差的绝对值是否小于公差(通常称为epsilon)。