如何处理cos的结果(M_PI / 2)

时间:2014-11-21 15:14:19

标签: c++ math floating-point-precision

M_PI是一个定义为3.14159265358979323846的宏,它看起来比双精度更精确。我试图在浮动中得到答案,没有任何数量的投射会对我有帮助,如果我尝试将M_PI投射到浮点数,结果总是6.12323426e-017或-4.37113883e-008。

答案应为0,我想把它存放在浮动中。

3 个答案:

答案 0 :(得分:3)

这是不可能的。在有限浮点数据类型中无法表示pi的精确值。

通常,您不能期望浮点值上的任何操作与实际值上的相应数学运算完全相等。通常的方法是与容差进行比较,在这种情况下可能类似于

if (std::abs(result) < tolerance) {
    // treat it as zero
}

选择合适的tolerance值以获得特定问题所需的准确性是困难的部分。

答案 1 :(得分:1)

M_PI宏使用精度比双精度更高的事实并没有改变cos函数M_PI/2的参数计算为double的事实。

因此,不是计算精确数'pi / 2'的余弦(0),而是计算最接近'pi / 2'的浮点数的余弦。因此结果不完全是0。

任何数量的铸造都不会改变它。

答案 2 :(得分:-1)

由于pi的浮点表示永远不会比机器epsilon更接近pi,因此该值超过2的余弦将与0的预期结果类似地不同。在数学上,pi的浮点值可以表示作为pi + eps,因此函数调用的值将是

  cos(pi/2 + eps/2) = -sin(eps/2) ~= -eps/2.