nie jest liczbą. Dlaczego?

0

Liczę dość prostą rzecz: odchylenie standardowe i co jakiś czas wyskakuje mi zamiast liczby jak ją wyświetlam komunikat: "nie jest liczbą".

public double Sigma()
        {
           double srednia = SredniaOcena();
            double wynik = Math.Sqrt(Aduze() - (srednia * srednia));
            
            return Math.Round(wynik,2);
        }

Co w takim kawałku kodu może pójść nie tak?
Sprawdzałem już na pewno czy funkcje Aduze() i SredniaOcena() nie bywają ujemne. Czy Aduze() nie bywa mniejsze od SredniaOcena().
A nawet, choć nie wiem po co czy nie wychodzi Math.Sqrt(0)

Sprawdzałem też czy mi gdzieś nie wyszły wartości inne w ten sposób:

if (x == Double.NaN || x == Double.PositiveInfinity || x == Double.NegativeInfinity)
{
}

Jednak rzadnego wejscia do tego ifa nie było.

Witki opadają.

Gdzie w tutaj w tak prostym przykładzie może być błąd?
Uruchomiłbym debuger, ale nie chce mi się klikać 200 razy aż w tym konkretnym przebiegu pętli złapię błąd.

Do kompletu dodam jeszcze te 2 funkjce:

 public double Aduze()
        {
            double srednia = 0;
            foreach (var item in osobniki)
            {
                srednia += item.FunkcjaPrzystosowania() * item.FunkcjaPrzystosowania();
            }

            return srednia / (double)osobniki.Count;

        }
public double SredniaOcena()
        {
            double srednia = 0;
            foreach (var item in osobniki)
            {
                srednia += item.FunkcjaPrzystosowania();
            }
            return srednia / (double)osobniki.Count;
        }

Wklejam logi z mojego programu jak widać kiedy występuje błąd "nie jest liczbą" zmienne:

double srednia = SredniaOcena();
double A = Aduze();

Zawsze przybierają dziwne konkretne wartości.

Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("BŁAD!!!!!!");
Console.WriteLine("srednia: " + srednia+" Aduze: "+ A);

9e29f67fb0.png

0

Ja zazwyczaj robię tak że jeżeli nie jestem pewien co się dzieje w moim programie sprawdzam jakie wartości poszczególne zmienne zawierają w każdym cyklu działania aplikacji w ten sposób mogę kontrolować czy wszystkie zmienne maja prawidłowa wartość. Zamiast wyświetlania tylko wyniku dopisz sobie też wyświetlanie innych zmiennych i sprawdź jaką maja wartość w momencie wyrzucenia błędnego wyniku i wtedy będziesz wiedział co może być źle.

2
public double Sigma()
        {
           double srednia = SredniaOcena();
            double wynik = Math.Sqrt(Aduze() - (srednia * srednia));
 
            return Math.Round(wynik,2);
        }

Co w takim kawałku kodu może pójść nie tak?

NaN == Not a Number == Wynik niektórych niepoprawnych operacji arytmetycznych.

Prawdopodobnie chodzi o to:

Console.WriteLine(Math.Sqrt(-1));

I to najprawdopodobniej jest Twój problem.

Inna opcja to

return srednia / (double)osobniki.Count;

Gdyby tu było 0/0, też równe NaN (osobniki puste).
Skoro na ekran wypisujesz jakieś populacja 0 to może o to chodzić.

if (x == Double.NaN || x == Double.PositiveInfinity || x == Double.NegativeInfinity)
{
}

Niestety, źle. Nie możesz tak porównywać z NaNem.

double x = double.NaN;
if (x == double.NaN) {
    Console.WriteLine("tak");
} else {
    Console.WriteLine("nie");
}

// a nawet
if (x == x) {
    Console.WriteLine("tak 2");
} else {
    Console.WriteLine("nie 2");
}

if (double.IsNaN(x)) {
    Console.WriteLine("poprawnie");
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1