błąd w wyniku (int) * (double)

0

Nie wiem, jak sobie z tym poradzić:

vector<double> wartosciX;
double wartosc;
double _wPiksela = 0.02;
wartosciX.clear();
for(int i=1; i<479; ++i)
{
        wartosc = -4.8 + i * _wPiksela;
        wartosciX.push_back(wartosc);
}

Problem w tym, że gdy wartość dotrze w "okolice" 0 to pojawiają się różnice rzędu 0.0000000000003
Fragment zawartości wektora po wykonaniu:

-4.78
-4.76
-4.74
...
-0.16
-0.14
-0.12
-0.0999999999999997
-0.0799999999999997
-0.0599999999999997
-0.0399999999999997
-0.0199999999999997
2.77555756156289E-16
0.0200000000000003
0.0400000000000003
0.0600000000000003
0.0800000000000003
0.1
0.12
0.14
...
4.72
4.74
4.76

Wcześniej spróbowałem napisać to tak:

double wartosc = -4.8;
double _wPiksela = 0.02;
wartosciX.clear();
for(int i=1; i<479; ++i)
{
        wartosc += _wPiksela;
        wartosciX.push_back(wartosc);
}

ale błąd pojawiał się już na jednym z pierwszych elementów! Czym to jest spowodowane i jak można to rozwiązać?</cpp>

0

Tak się składa, że proste liczby w systemie dziesiętnym jak 0.1 czy 0.2 mają bardzo długie rozwinięcia (czasem nieskończone) w systemie dwójkowym. Miałem to samo jak pisałem program na metody numeryczne - liczba 0.1 miała zbyt długie rozwinięcie i jeśli pakowałem ją w double to 10*0.1 nie wychodziło 1.

Rozwiązaniem było zastąpienie double na long double - ta liczba jest już dość długa, aby rozwinięcie binarne takich ułamków się zmieściło.

0

Dzięki, zamieniłem double na long double i teraz oblicza dokładnie.

Nadal pozostaje błąd w obliczeniu zera. Co prawda, w formacie zmiennopozycyjnym nie można przedstawić zera, ale czy można to jakoś obejść?

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