Cos(90)返回的值非常接近0,但我需要0?

时间:2011-11-21 22:30:14

标签: c++

temp_x_btm_left = 0&的值temp_y_btm_left = 1;

angle = 90;

//Moving the bottom left coordinates
_btm_left.real() = (temp_x_btm_left * cos(angle*PI/180)) 
                   - (temp_y_btm_left * sin(angle*PI/180));
_btm_left.imag() = (temp_x_btm_left * sin(angle*PI/180)) 
                   + (temp_y_btm_left * cos(angle*PI/180));

代码应该将对象逆时针旋转90度,但_btm_left.imag()返回的值非常接近0 = 1.437949e-009,我真的需要它为0。

我已尝试setprecision()setw(),但似乎没有任何效果。有没有这样的方法,或者我需要创建自己的方法来解决这个问题?!

5 个答案:

答案 0 :(得分:4)

只要| v1-v2 | < predefinedDelta,只考虑v1 == v2。

答案 1 :(得分:4)

三角函数以弧度为参数,而不是度数。您对angle*PI/180的计算并不能准确得出PI / 2,这当然不能完全表示为浮点数。

解决方案是在转换为弧度之前比较特殊值,例如:克。

if (angle == 90.0)
    x = 0.0
else
    x = cos(angle*PI/180.0)

答案 2 :(得分:4)

以前答案中提到的“魔法ε”实际上是由语言提供的

 #include <limits>
 std::numeric_limits<float>::epsilon();

 std::numeric_limits<double>::epsilon();

是“1和最大值之间的差值,大于1可表示”

答案 3 :(得分:1)

一种解决方案是将Epsilon设置为等于某个神奇的小值,然后检查函数提供的结果的绝对值是否小于(或小于或等于){{1} 1}}。

(将其命名为Epsilon只是一种约定;它可以是Epsilon

答案 4 :(得分:0)

预先计算角度计算,然后使用结果。类似的东西:

if (angle == 90) {
  cos_angle = 0
} else {
  cos_angle = cos(angle)
}
...
_btm_left.real() = ... * cos_angle ...

这样做的另一个好处是可以减少对cos()sin()的调用。

请记住,如果angle是浮点数,那么执行类似angle == 90的操作总是会返回false,因为内部表示浮点数。您可能希望将其更改为:

if (abs(angle-90) < some_small_number) {