由于 - nan,计算失败

时间:2015-10-06 19:18:15

标签: c++

我的练习是编写将打印此短语值的代码

我编写了一个应该有效的代码,但是当我尝试打印我收到的值时,值为-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 );


}

我的问题是如何打印正确的值?

3 个答案:

答案 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)

问题在于,根据单位(radiansdegrees),您可以使用三角函数得到不同的结果。请注意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 的操作是:

enter image description here

在您的情况下,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;