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

C++ Cos(90)返回一个非常接近0的值,但我需要0?,c++,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(angl

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度,但
\u btm\u left.imag()
返回的值非常接近0=1.43949E-009,我需要它为0


我试过
setprecision()
setw()
但似乎没有任何效果。有什么方法可以解决这样的问题吗?或者我需要创建自己的方法来解决这个问题吗

>P>只要V1-V2>PrimeDealDelphi,简单地考虑V1==V2../P>< P >一个解决方案是设置一个等于某个魔法小值的<代码>ε< /代码>,然后检查函数所提供的结果的绝对值是否小于或小于或等于你的<代码>ε< /> > < <
(将其命名为Epsilon只是一种惯例;它可以是double MagicalNumberInDect=VerySmallValue;)

预先计算角度计算,然后使用结果。比如:

if (angle == 90) {
  cos_angle = 0
} else {
  cos_angle = cos(angle)
}
...
_btm_left.real() = ... * cos_angle ...
if (abs(angle-90) < some_small_number) {
这还有另外一个好处,即对
cos()
sin()
的调用更少

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

if (angle == 90) {
  cos_angle = 0
} else {
  cos_angle = cos(angle)
}
...
_btm_left.real() = ... * cos_angle ...
if (abs(angle-90) < some_small_number) {
if(abs(角度-90)
三角函数以弧度为参数,而不是以度为参数。计算
角度*PI/180
不会得到精确的PI/2,这当然不能精确表示为浮点

一个解决方案是在转换为弧度之前与特殊值进行比较,例如

if (angle == 90.0)
    x = 0.0
else
    x = cos(angle*PI/180.0)
在前面的回答中提到的“神奇的ε”实际上是由via语言提供的

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

std::numeric_limits::epsilon();

这是“1与可表示的大于1的最小值之间的差值”

setprecision
setw
与流有关。浮点相等比较不可移植,应避免(零除外)。