我编写了一个应该有效的代码,但是当我尝试打印我收到的值时,值为-nan"。
//My Code
#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;
int main()
{
double y;
double x = 21;
y = 30 * sqrt(x * (1/(tan(sqrt(3*x) - 2.1))));
printf ("The value is: \n=> %f", y );
}
我的问题是如何打印正确的值?
答案 0 :(得分:3)
试试这个
printf( "sqrt(3*x) = %lf\n", sqrt(3*x));
printf( "sqrt(3*x) - 2.1 = %lf\n", sqrt(3*x) - 2.1);
printf( "tan(sqrt(3*x) - 2.1) = %lf\n", tan(sqrt(3*x) - 2.1));
然后你会注意到最后一个是负数,这将导致一个负数的sqrt,因此NaN
答案 1 :(得分:2)
问题在于,根据单位(radians或degrees),您可以使用三角函数得到不同的结果。请注意tan
函数expects its argument in radians。
sqrt(3*21)-2.1 = 5.837
,你必须计算它的正切值。如果我们使用弧度(它在-0.478
附近),导致负数的平方根为NaN
(非数字),那确实是负面的,但是如果你使用度数那么它是+0.102
您可以完成计算。如果你想得到度数的结果,考虑到函数接受弧度,你必须转换数字。转换很简单:乘以Pi并除以180.就像这样:
y = 30 * sqrt(x * (1/(tan((sqrt(3*x) - 2.1)*M_PI/180))));
在这种情况下,结果为429.967
。
答案 2 :(得分:0)
如果问题与转换为弧度无关,即乘以M_PI / 180.
通常,生成NaN
(非数字) 1 的操作是:
在您的情况下,tan()
的结果为负数,导致外部sqrt()
的负输入值,这是上表中的最后一个示例。
要解决有问题的情况,您可以使用一些数学技巧 2 并尝试重写表达式,使其不产生NaN,或者如果问题出现在负平方根中,您可以使用#include <complex>
和:
std::complex<double> two_i = std::sqrt(std::complex<double>(-4));
其余答案为您提供了如何识别NaN源的策略,通过检查所涉及的每个计算
1。为特殊情况保留的位模式可以处理异常情况,例如取负数的平方根,而不是中止计算,称为NaN
s。
2。使用三角关系。
其中#define M_PI = 3.14159265358979323846;