2017-03-20 14 views
0

C#を使用して2次方程式の結果を計算しようとしましたが、結果はNaNです。誰かが私のコードをチェックしてエラーを見つけることができますか?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); 
    } 
    } 
} 
+1

は、私たちは "b" と "c" は、変数 "A" のために入力した正確な数値を見ることができますか? –

+6

[小さなプログラムをデバッグする方法を学ぶ必要があります](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)、あなたに問題を見つけるように頼むだけです。プログラムを試して勉強する恐ろしい方法。 –

答えて

1

引数が正でなければなりません。

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); 
} 
+0

答えをありがとう!私は本当にコードを修正しようとしていた。 –

0

根は、例えば、一般的な場合に複合数であります

... 
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); 
0

私はSQRT用負の値の場合に対処するには、以下の行ったように三項演算子を使用してのNaNかどうかを確認するでしょう:私はないfloatComplexを使用することをお勧め理由です

x**2 + 1 = 0 

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