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

[C++]Program liczący, która liczba znajduje się najbliżej średniej, błąd zliczania powtórzeń pętli while

Ostatnio zmodyfikowano 2015-03-06 15:04
Autor Wiadomość
Mlorism
Temat założony przez niniejszego użytkownika
[C++]Program liczący, która liczba znajduje się najbliżej średniej, błąd zliczania powtórzeń pętli while
» 2015-03-05 20:47:13
Piszę program w Code::Blocks 13.12, który na podstawie podanych 5 liczb wyznacza taką, która znajduje się najbliżej średniej. Za metodę przyjąłem odejmowanie w przypadku liczby większej od średniej lub dodawanie w przypadku liczby mniejszej od średniej wartości 0.001, co umieściłem w pętli while, przy okazji inkrementując wartość powtórzeń (w programie jako zmienna "kroki"). Nie rozumiem dlaczego dla liczb oddalonych tak samo od średniej przyjmuje inne wartości powtórzeń pętli np dla średniej 15, wartość kroków dla liczby 5 to 9998, dla 10 4998, dla 20 5002, a dla 25 10005. Skąd takie dziwne wartości i jak mogę naprawić ten błąd?



C/C++
#include <iostream>

using namespace std;
float liczba[ 5 ], suma = 0, srednia;
int kroki[ 5 ];


int main()
{
    cout << "Program sluzy do wyznaczania liczby, ktora jest nablizsza sredniej z 5 podanych." << endl;
    cout << "Liczby, z ktorych sie ja wyznacza moga miec 2 miejsca po przecinku,"
    << endl << "za ktory sluzy kropka." << endl << endl;
    for( int i = 0; i < 5; i++ )
    {
        cout << "Podaj " << i + 1 << " liczbe : ";
        cin >> liczba[ i ];
    }
   
    for( int i = 0; i < 5; i++ )
    {
        suma += liczba[ i ];
    }
   
    cout << "Suma: " << suma << endl;
    srednia =( suma / 5 );
    cout << "Srednia: " << srednia << endl;
   
    for( int i = 0; i < 5; i++ )
    {
        kroki[ i ] = 0;
        if( liczba[ i ] <= srednia )
        {
            while( liczba[ i ] < srednia )
            {
                liczba[ i ] += 0.001;
                kroki[ i ] ++;
            }
           
        }
        else if( liczba[ i ] >= srednia )
        {
            while( liczba[ i ] > srednia )
            {
                liczba[ i ] -= 0.001;
                kroki[ i ] ++;
            }
           
        }
        else
        {
            kroki[ i ] = 0;
        }
        cout << "Dla liczby " << i + 1 << " liczba krokow wynosi: " << kroki[ i ] << endl;
    }
   
    return 0;
}

ps. Program nie bierze jeszcze pod uwagę występowania 2 liczb tak samo oddalonych od średniej, lecz to nie jest teraz problemem. Tak samo nie interesuje mnie póki co inne, nawet bardziej wydajne rozwiązanie problemu, a jedynie przyczyna wystąpienia takiej anomalii.
P-127767
aksen
» 2015-03-05 22:16:41
Robisz jakieś cuda wianki.

dla każdej liczby policz:
| srednia - liczba |  (wartość bezwzględną z różnicy).
Wygrywa liczba która da najmniejszy wynik. Tyle.

PS.
W C/C++ wartość bezwzględna to abs
P-127772
Mlorism
Temat założony przez niniejszego użytkownika
» 2015-03-06 08:53:41
Udało mi się rozwiązać problem. Wpierw spróbowałem zmienić zmienną kroki na double, lecz ciągle pojawiał się błąd, ale kiedy zastosowałem long double przy tej dokładności algorytmu błąd zniknął. Więc program wykonuje to co chciałem. Podpowiedziano mi z double, więc dalej kombinowałem i się udało.
P-127800
Monika90
» 2015-03-06 15:04:01
Ani double, ani long double nie rozwiązują problemu. W popularnych implementacjach żaden z typów zmiennoprzecinkowych nie może mieć wartości 0.001, ponieważ reprezentcja jest binarna, a nie dziesiętna. Na dodatek, wyniki dodawania i odejmowania często są przybliżone, może się nawet zdarzyć, że x + 0.001 jest równe x.
P-127812
« 1 »
  Strona 1 z 1