Mi chiedo solo, è ansible calcolare le radici quadrate dei numeri negativi in C #? Ad esempio sqrt (-1) = i.
Ho scritto questo pezzo di codice:
using System; public static class sqrts { public static void Main() { string x; double sqrtofx; Console.Write("Enter a number: "); x = Console.ReadLine(); sqrtofx = Math.Sqrt(Convert.ToInt32(x)); Console.WriteLine("\nSqrt({0}): {1}", x, sqrtofx); Console.ReadKey(); } }
Se inserisco 25, dà 5. Tuttavia, se inserisco -5, dà NaN invece di 5i.
C’è una struttura Complex
che dovrebbe fare ciò di cui hai bisogno:
Complex c = Complex.Sqrt(-25); // has a value of approximately 0 + 5i
(Esiste una conversione implicita dalla maggior parte dei tipi di numeri, incluso int
, a Complex
. Funziona come probabilmente ti aspetteresti: il numero è preso come la parte reale e la parte immaginaria è 0. Ecco come -25
è un parametro valido a Complex.Sqrt(Complex)
.)
Utilizzare la struttura complessa implementata di C #: http://msdn.microsoft.com/en-us/library/system.numerics.complex.aspx
Complex c = new Complex(-1,0); Complex result = Complex.Sqrt(c);
http://msdn.microsoft.com/en-us/library/system.numerics.complex.sqrt.aspx
double
(o int
, long
, short
o qualsiasi altro tipo numerico incorporato) non è costruito per supportare numeri non reali. Esistono librerie che sono costruite per supportare qualsiasi numero complesso, ma in cambio di tale funzionalità aggiunta occupano più spazio e le operazioni su di esse sono molto più lente. Poiché gran parte del campo ha una richiesta di calcoli su numeri reali, non è ragionevole aggiungere questi costi a questi tipi numerici di base.
Questo perché le radici quadrate di numeri negativi producono numeri complessi. In matematica più di base e generale si presume che la radice quadrata si applichi solo ai numeri positivi. Prendi la radice quadrata del valore assoluto dei tuoi numeri o usa il tipo di dati Complex
e la sua funzione di radice quadrata. Ciò che decidi dipende da cosa miri a raggiungere.
o potresti semplicemente farlo
public static float Root(float value) { int negative = 1; if(value < 0) negative = -1; return Math.Sqrt(Math.Abs(value)) * negative; }
allora puoi usare questa funzione ogni volta che devi sradicare senza avere paura
questo dovrebbe essere molto meno pesante del Complesso e tu hai un buon controllo su di esso.
Perché non controllare prima se negativo, e se lo è, moltiplicare per (-1) e aggiungere i
all’output?