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()
,但似乎没有任何效果。有没有这样的方法,或者我需要创建自己的方法来解决这个问题?!
答案 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) {