Precizia numerelor complexe

De la YO3ITI
Versiunea din 29 martie 2020 14:09, autor: Yo3iti (discuție | contribuții) (Yo3iti a redenumit pagina Precizia numerelor complexe în C în Precizia numerelor complexe)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)
Sari la navigare Sari la căutare

Partea reală și partea imaginară a unui număr complex sunt reprezentate ca variabile în virgulă mobilă de tip double. Din acest motiv își pot pierde precizia ca urmare a operațiunilor matematice. Asta înseamnă că strictețea comparațiilor de egalitate nu este garantată și poate da erori. De exemplu, aplicarea unei funcții exponențiale asupra rezultatului unui logaritm va da diferențe:

Complex value = new Complex(Double.MinValue/2, Double.MinValue/2);
Complex value2 = Complex.Exp(Complex.Log(value));
Console.WriteLine("{0} \n{1} \nEgal: {2}", value, value2, 
                                            value == value2);
// Exemplul va afișa în consolă:
//    (-8.98846567431158E+307, -8.98846567431158E+307)
//    (-8.98846567431161E+307, -8.98846567431161E+307)
//    Egal: False

În mod asemănător, următorul exemplu, prin care se calculează rădăcina pătrată a unui număr complex, va da rezultate diferite pe versiunile pe 32 biți și IA64 ale platformei .NET:

Complex minusOne = new Complex(-1, 0);
Console.WriteLine(Complex.Sqrt(minusOne));
// Exemplul va afișa în consolă:
//    (6.12303176911189E-17, 1) pe sisteme de operate pe 32 biți.
//    (6.12323399573677E-17,1) pe sisteme IA64.