gpt4 book ai didi

c++ - 使用 sin 和 cos 函数迭代时的 Nan 结果

转载 作者:太空狗 更新时间:2023-10-29 21:25:26 24 4
gpt4 key购买 nike

我正在使用 Code::Blocks 10.05 编译这个程序,但是通常我会在它开始在每个输出中生成 Nan 之前完成大约 10 次迭代。我想知道这是否是使用 cos 和 sin 函数引起的问题,是否有适当的解决方法来避免这种情况?

我必须进行大量迭代,因为我正在为大学做一个项目,所以它也必须准确。我查阅了一些关于如何避免使用 sin 和 cos 的文章,尽管我需要严格遵循一些公式,否则我产生的结果可能不准确,所以我不确定是否妥协。

    struct Particle // Need to define what qualities our particle has
{
double dPosition;
double dAngle;

};

Particle Subject;

void M1(double &x, double &y) //Defines movement if particle doesn't touch inner boundary
{
x = x + 2*y;
}

double d = 0.25; //This can and will be changed when I need to find a distance between
// the two cricles at a later stage


void M2(double &x,double &y, double d) //Defines movement of a particle if it impacts the inner boundary
{
double z = asin(-(sin(y)+d*cos(x + y))/0.35);
double y1 = y;
y = asin(-0.35*sin(z) + d*cos(x + y + 2*z));
x = y + y1 + x + 2*z;
}

int main()
{
cout << "Please tell me where you want this particle to start positions-wise? (Between 0 and 2PI" << endl;
cin >> Subject.dPosition;
cout << "Please tell me the angle that you would like it to make with the normal? (Between 0 and PI/2)" << endl;
cin >> Subject.dAngle;
cout << "How far would you like the distances of the two middle circles to be?" << endl;
double d;
cin >> d;

// These two functions are to understand where the experiment begins from.
// I may add a function to change where the circle starts however I will use radius = 0.35 throughout

cout << "So position is: " << Subject.dPosition << endl;
cout << "And angle with the normal is: " << Subject.dAngle <<endl;

int n=0;
while (n <= 100) //This is used to iterate the process and create an array of Particle data points
{ // in order to use this data to build up Poincare diagrams.

{
while (Subject.dPosition > 2*M_PI)
Subject.dPosition = Subject.dPosition - 2*M_PI;
}
{
if (0.35 >= abs(0.35*cos(Subject.dPosition + Subject.dAngle)+sin(Subject.dAngle))) //This is the condition of hitting the inner boundary
M2(Subject.dPosition, Subject.dAngle, d); //Inner boundary collision
else
M1(Subject.dPosition, Subject.dAngle); // Outer boundary collision
};
cout << "So position is: " << Subject.dPosition << endl;
cout << "And angle with the normal is: " << Subject.dAngle <<endl;
n++;
}
return 0;
}

最佳答案

Nan 在 c++ 中表示无限、零差和不可表示数的一些其他变体。

编辑:

正如 Matteo Itallia 所指出的,inf 用于无限/零除法。我发现了这些方法:

template<typename T>
inline bool isnan(T value) {
return value != value;
}

// requires #include <limits>
template<typename T>
inline bool isinf(T value) {
return std::numeric_limits<T>::has_infinity &&
value == std::numeric_limits<T>::infinity();
}

引用:http://bytes.com/topic/c/answers/588254-how-check-double-inf-nan

关于c++ - 使用 sin 和 cos 函数迭代时的 Nan 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14007514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com