NaN的计算结果

时间:2017-03-20 21:10:10

标签: c#

我试图使用C#计算二度方程的结果,但我得到结果NaN。有人可以检查我的代码以找到错误吗?

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

 namespace desafio2_2
 {
  class Program
   {
     static void Main(string[] args)
     {
     Console.WriteLine("Please insert the values that multiply x², x and the independent term respectively: ");
     float a = float.Parse(Console.ReadLine());
     float b = float.Parse(Console.ReadLine());
     float c = float.Parse(Console.ReadLine());

     double bhaskarap1 = (Math.Pow(b, 2)) + (- 4 * a * c);
     double raiz1 = (-b + Math.Sqrt(bhaskarap1)) / (2 * a);
     double raiz2= (-b - Math.Sqrt(bhaskarap1)) / (2 * a);
        Console.WriteLine(raiz1);
        Console.WriteLine(raiz2);
     }
  }
}

4 个答案:

答案 0 :(得分:3)

二次方程可能没有真正的根。在这种情况下,判别式将为负数。

Math.Sqrt(x)为负时,

x会返回NaN。在调用平方根函数之前,您应该测试负数的判别式。

static void Main(string[] args)
{
    Console.WriteLine("Please insert the values that multiply x², x and the independent term respectively: ");
    float a = float.Parse(Console.ReadLine());
    float b = float.Parse(Console.ReadLine());
    float c = float.Parse(Console.ReadLine());

    double bhaskarap1 = (Math.Pow(b, 2)) + (- 4 * a * c);
    if (bhaskarap1 < 0)
    {
         Console.WriteLine("There are no real solutions.");
         return;
    }
    double raiz1 = (-b + Math.Sqrt(bhaskarap1)) / (2 * a);
    double raiz2= (-b - Math.Sqrt(bhaskarap1)) / (2 * a);
    Console.WriteLine(raiz1);
    Console.WriteLine(raiz2);
}

答案 1 :(得分:1)

sqrt方法的参数必须是正的。

答案 2 :(得分:0)

一般情况下,二次方程的根是复数数,例如

x**2 + 1 = 0

这就是为什么我建议使用Complex,而不是float

...
using System.Numerics;
...

// float.Parse - if you want to allow just real coefficients
Complex a = float.Parse(Console.ReadLine());
Complex b = float.Parse(Console.ReadLine());
Complex c = float.Parse(Console.ReadLine());

Complex bhaskarap1 = b * b - 4 * a * c;
Complex raiz1 = (-b + Complex.Sqrt(bhaskarap1)) / (2 * a);
Complex raiz2 = (-b - Complex.Sqrt(bhaskarap1)) / (2 * a);
Console.WriteLine(raiz1);
Console.WriteLine(raiz2);

答案 3 :(得分:0)

我会使用三元运算符检查NaN,如下所示,以处理sqrt的负值。

float a = 4.0f, b = 7.0f, c = -3.0f;

double my_var = ((Math.Pow(b, 2)) + (-4 * a * c));
Console.WriteLine(my_var);
Console.WriteLine(((-b + Math.Sqrt(-1 * my_var)) / (2 * a)));

double temp = (-b + Math.Sqrt(my_var)) / (2 * a); 
double raiz1 = temp.CompareTo(Double.NaN) < 1 ? 0.00 : temp;
temp = (-b + Math.Sqrt(-1 * my_var)) / (2 * a);
double raiz2 = temp.CompareTo(Double.NaN) < 1 ? 0.00 : temp;

Console.WriteLine($"Raiz1: {raiz1}\tRaiz2: {raiz2}");

输出:

97                                                                                                                                                                                                                                                     
NaN                                                                                                                                                                                                                                                    
Raiz1: 0.356107225224513        Raiz2: 0