Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Liczby zmiennoprzecinkowe - błąd kompilatora - liczba 93.1001 zamiast 93.1

Ostatnio zmodyfikowano 2016-01-01 21:41
Autor Wiadomość
grupowana
Temat założony przez niniejszego użytkownika
Liczby zmiennoprzecinkowe - błąd kompilatora - liczba 93.1001 zamiast 93.1
» 2015-12-31 19:24:16
O co chodzi? Może ktoś wie jak rozwiązać ten problem.
C/C++
#include <iostream>
using namespace std;

int main()
{
   
    int poziom = 400, poziom_wyjsciowy = 1;
   
    float licznik = 0, wzrost_dla_wzoru, p_wyzszy;
   
    for(; poziom_wyjsciowy <= poziom; poziom_wyjsciowy += 3, licznik += 0.1 )
    { wzrost_dla_wzoru = licznik; }
   
   
    cout << "Poziom wyjsciowy: " << poziom_wyjsciowy;
    cout << endl << "Licznik wzoru: " << licznik << endl;
    cout << endl << "Wzrost dla wzoru: " << wzrost_dla_wzoru << endl;
   
   
    p_wyzszy = wzrost_dla_wzoru * 7;
    cout << endl << "Poziom wyzszy ***Blad***: " << p_wyzszy << endl;
   
    wzrost_dla_wzoru = 13.3;
    p_wyzszy = wzrost_dla_wzoru * 7;
    cout << endl << "Poziom wyzszy: " << p_wyzszy << endl;
   
    return 0;
}
Kompilator: GCC 4.9.2 64-bit Release, standard ISO C++11
Środowisko: Dev-C++ 5.11

Wynik działania:

Poziom wyjsciowy: 403
Licznik wzoru: 13.4

Wzrost dla wzoru: 13.3

Poziom wyzszy ***Blad***: 93.1001

Poziom wyzszy: 93.1

--------------------------------
Process exited after 0.02779 seconds with return value 0
Aby kontynuować, naciśnij dowolny klawisz . . .

Byłoby fajnie, gdyby jakaś osoba podesłała wynik działania programu w innym kompilatorze.
P-142648
mateczek
» 2015-12-31 22:07:50
double licznik = 0, wzrost_dla_wzoru, p_wyzszy;

Porównywanie liczb zmiennoprzecinkowych w ten sposób
poziom_wyjsciowy <= poziom
 mija się z celem!! Bo takie liczby to zawsze jakieś tam przybliżenie!!! Prawie zawsze wyskoczy jedna iteracja za za mało lub za dużo :P
P-142652
grupowana
Temat założony przez niniejszego użytkownika
Liczby zmiennoprzecinkowe - błąd kompilatora - liczba 93.1001 zamiast 93.1
» 2016-01-01 16:40:37
Ok, dzięki :) zmiana na double pomogła.

Ale nadal nie rozumiem dlaczego nie można użyć float, przecież 39.1 mieści się w przedziale 7-8 cyfr po przecinku... Nie wiem też za bardzo co ma do tego zakres
>> ± 3.4  × (10±^38) << bo wg mnie wychodzi z tego 340000000000000000000000000000000000000 co jest chyba kompletnie bez sensu.

Jest gdzieś może jakiś dobry artykuł o liczbach zmiennoprzecinkowych?
P-142661
mateczek
» 2016-01-01 17:33:59
Na początek skompiluj sobie ten kod !!!
C/C++
#include <iostream>
using namespace std;

int main()
{
    float i = 0;
   
    while( 1 ) {
        i = i + 0.1;
        if( i == 1 ) break; //powinno się skończyć gdy i przyjmie wartość 1 :P
       
        if( i > 2.00000001 ) break; // limit bezpieczeństwa aby się jednak pętla skończyła :P te zera po przecinku też mają cel ( są po to aby ostatnia liczba się wyświetliła)
       
        cout << i << endl;
    }
}

Komputer nie zapisuje liczb na kartce :) liczba 0.1 nie istnieje dla komputera. istnieje tylko jakaś reprezentacja bajtowa bitowa tej liczby (nie wnikałem jak taką liczbę zapisać więc Ci nie odpowiem). Wiem tylko, że będzie to jakieś mniej lub bardziej dokładne przybliżenie liczby 0.1

Coś tak jak w systemie dziesiętnym nie jesteś w stanie dokładnie zapisać liczby(ułamka) 1/3 = 0.33333 itp :P


liczby zmiennoprzecinkowe jako warunki w pętlach trzeba po prostu zawsze przemyśleć :) operatory ze znakiem ==, <=, >=, są bez sensu dla liczb zmiennoprzecinkowych

edit:// Zadanie 2. nawet fajny program tam jest odnośnie liczb zmienno przecinkowych
http://www.staff.amu.edu.pl/~rmiw/MEN331/cwiczenia1.html
P-142662
Gibas11
» 2016-01-01 21:41:19
Radzę każdemu kto nie wie jak to działa przeczytać, potem operacje na float i double są bardziej zrozumiałe. https://pl.m.wikipedia.org​/wiki/Liczba_zmiennoprzecinkowa
P-142669
« 1 »
  Strona 1 z 1