[C++] Algorytm zaokrąglania liczb


(Quentin) #1

Witam!

W Symfonii C++ z 2006 roku jest opisana funkcja inline. Mam trochę inne pytanie. Na wstępie jest pokazana taka oto funkcja służąca do zaokrąglania (nie wiem tylko po co jest tam to + 0.5 ):

int zao(double liczba)

{

return (liczba + 0.5);

}

Później jest fragment:

Czy ktoś mógłby mi wytłumaczyć o co chodzi z tym algorytmem (dokładnie i w miarę zrozumiale) jak i z tą pierwszą linijką :?: W tej pierwszej nie powinno być po prostu np.:

double x;

cin >> x;


zao(x); // teraz otrzymujemy zaokrągloną liczbę - jeśli wpisalibyśmy np. 9.4 to 9.4 + 0.5 = 9.9 = 9

Nie rozumiem o co w tym chodzi. Aha i dziwne jest to co jest na początku tych wyrażeń - to jest albo mała literka l albo 1, ale z tego co porównywałem ze znakami z książki to jest po prostu literka (mała) l - czyli pewnie jakaś zmienna...

Z góry wielkie dzięki za wytłumaczenie działania tych 2 wyrażeń :wink:


(Sawyer47) #2

Przy konwersji z double na int brana jest pod uwagę tylko część przed przecinkiem dziesiętnym, reszta jest ucinana. Więc jeśli masz 2.7 to po konwersji do int dostaniesz 2 (więc jest to "ucinanie", a nie zaokrąglanie). Dlatego dodaje się do pierwotnej liczby 0.5, aby dla wartości po przecinku większych bądź równych od 0.5 otrzymać wartość przed przecinkiem zwiększoną o 1. Np. int(2.2 + 0.5) == 2, czyli dobrze zaokrąglone 2.2, a int( 2.5 + 0.5) == 3, czyli dobrze zaokrąglone 2.5. Mam nadzieje, że jasno wytłumaczone.


(Quentin) #3

OK dzięki już rozumiem mniej więcej. A teraz odnośnie tego 1 - szego wyrażenia - czego jest akurat tak, jak jak tam pisze, a nie po prostu tak jak ja napisałem ? ;/ Już nawet się nie pytam o 3 - cie bo mi to niepotrzebne...


([alex]) #4

Quentin , naprawdę nie rozumiem co masz na myśli pisząc:


(Quentin) #5

[alex], popatrz na pierwszy kod w moim 1 - szym poście. To jest funkcja do zaokrąglania podanej liczby. W cytacie jest napisane, że można tą funkcję wywołać tak:

zao(m) + zao(n * 16.7);

I nie wiem po prostu co robi to zao(n * 16.7). Czemu nie mogło by być tak jak ja napisałem:

double x;

cin >> x;


zao(x); // teraz otrzymujemy zaokrągloną liczbę - jeśli wpisalibyśmy np. 9.4 to 9.4 + 0.5 = 9.9 = 9

Mam nadzieję, że już jest jasne to... EDIT: Mały błąd się tam wkradł. Powinno być coś takiego:

double x;

cin >> x;


m = zao(x); // teraz otrzymujemy zaokrągloną liczbę - jeśli wpisalibyśmy np. 9.4 to 9.4 + 0.5 = 9.9 = 9


cout << m;

([alex]) #6

Możesz nawet tak:

chodzi o to, że jako parametr funkcji może zostać podana nie tylko zmienna czy stała ale nawet wyraz.

double x;

cin>>x;

cout<<"wartosc "<




W podanym przykładzie:

[code]zao(n * 16.7);