Jak zaokrąglić liczbę zmiennoprzecinkową do całkowitej w avr-gcc?

[avr-gcc] zaokraglanie :))





Poprzedni Następny
Wiadomość
Spis treści
From: "Pawel Kurzawa" <groups_at_nospam_kpw.qs.pl>
Subject: [avr-gcc] zaokraglanie :))
Date: Tue, 15 Feb 2005 18:12:45 +0100


Witam,
mam liczbe zmienno przecinkowa i chcialbym ja
zamienic na liczbe calkowita, jednak z zachowaniem
zasad zaokraglania. Jaka funkcja to czyni?

--
--
Best regards
K_at_nospam_pW from Poland

kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------



Poprzedni Następny
Wiadomość
Spis treści
From: Waldemar <waldemar.krzok_at_nospam_t-online.de>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Tue, 15 Feb 2005 18:32:00 +0100


Pawel Kurzawa wrote:
Witam,
mam liczbe zmienno przecinkowa i chcialbym ja
zamienic na liczbe calkowita, jednak z zachowaniem
zasad zaokraglania. Jaka funkcja to czyni?

(int) (a + 0.5), na przykład

Waldek

Poprzedni Następny
Wiadomość
Spis treści
From: =?ISO-8859-2?Q?=A3ukasz_G=F3ralczyk?= <lukasz_at_nospam_goraNOSPAMlczyk.com>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Tue, 15 Feb 2005 22:10:51 +0100


Waldemar wrote:
Pawel Kurzawa wrote:
mam liczbe zmienno przecinkowa i chcialbym ja
zamienic na liczbe calkowita, jednak z zachowaniem
zasad zaokraglania. Jaka funkcja to czyni?

(int) (a + 0.5), na przykład

#include <stdio.h>
int main( void )
{
double a=0.9999, b=1.0000;
printf( "%.4lf + %.4lf = %d\n", a, b, (int) (a+b) );
return 0;
}

Co otrzymamy w wyniku? Oczywiście, że jeden! Z liczbami zmienno
przecinkowymi jest trochę klopotu, i trzeba być bardzo ostrożnym. Jak
pamietam (x86-visual-c++-6.0) to taka funkcję (dobrą) sam musiałem sobie
napisać. A zasady zaokrąglania można nietrudno zaimplementować.

--
Łukasz Góralczyk
http://lukasz.goralczyk.com
Usun NOSPAM z adresu email nim odpowiesz

Poprzedni Następny
Wiadomość
Spis treści
From: =?ISO-8859-2?Q?=A3ukasz_G=F3ralczyk?= <lukasz_at_nospam_goraNOSPAMlczyk.com>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Tue, 15 Feb 2005 22:17:57 +0100


Łukasz Góralczyk wrote:
napisać. A zasady zaokrąglania można nietrudno zaimplementować.

No, no, trochę przesadziłem... to nie jest takie łatwe, w zależności
jakie sobie przyjmiesz założenia, do którego miejsca zaokrąglanie, ile
miejsc po przecinku brać pod uwagę. Zrobienie uniwersalnej funkcji nie
jest łatwe.
Jeśli masz mało miejsca w swoim avr-ku to zastanowiłbym się nad
implementacją stałego przecinka.


--
Łukasz Góralczyk
http://lukasz.goralczyk.com
Usun NOSPAM z adresu email nim odpowiesz

Poprzedni Następny
Wiadomość
Spis treści
From: Jurek Szczesiul <jerzy.szczesiul_at_nospam_wycin.ep.com.pl>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Tue, 15 Feb 2005 22:44:47 +0100


Tue, 15 Feb 2005 22:17:57 +0100, na pl.misc.elektronika, Łukasz Góralczyk
napisał(a):

Łukasz Góralczyk wrote:
napisać. A zasady zaokrąglania można nietrudno zaimplementować.

No, no, trochę przesadziłem... to nie jest takie łatwe, w zależności
jakie sobie przyjmiesz założenia, do którego miejsca zaokrąglanie, ile
miejsc po przecinku brać pod uwagę. Zrobienie uniwersalnej funkcji nie
jest łatwe.

Prawda, zwłaszcza że są jeszcze jakieś specjalne szczególiki wymagane w
księgowości. Ale tu miało byc zwyczajne zaokrąglenie do całkowitych, IMHO
ze zwyczajowym : część ułamkowa <0.5 - do dołu , >=0.5 - do góry.
Wtedy wystarczy np.

int Round(double value)
{
double tolow=floor(value);
if((value-tolow) < 0.5) return (int)tolow; else return (int)tolow+1 ;
}

A i tak dużo zasobów pochłania.

--
Pozdrowienia
Jurek Szczesiul

Poprzedni Następny
Wiadomość
Spis treści
Date: Tue, 15 Feb 2005 22:49:49 +0100
From: RoMan Mandziejewicz <roman_at_nospam_pik-net.pl>
Subject: Re: [avr-gcc] zaokraglanie :))


Hello Jurek,

Tuesday, February 15, 2005, 10:44:47 PM, you wrote:

napisać. A zasady zaokrąglania można nietrudno zaimplementować.
No, no, trochę przesadziłem... to nie jest takie łatwe, w zależności
jakie sobie przyjmiesz założenia, do którego miejsca zaokrąglanie, ile
miejsc po przecinku brać pod uwagę. Zrobienie uniwersalnej funkcji nie
jest łatwe.
Prawda, zwłaszcza że są jeszcze jakieś specjalne szczególiki wymagane w
księgowości. Ale tu miało byc zwyczajne zaokrąglenie do całkowitych, IMHO
ze zwyczajowym : część ułamkowa <0.5 - do dołu , >=0.5 - do góry.
Wtedy wystarczy np.
int Round(double value)
{
double tolow=floor(value);
if((value-tolow) < 0.5) return (int)tolow; else return (int)tolow+1 ;
}
A i tak dużo zasobów pochłania.

Hmmm.... Nie prościej: int(value + 0.5)?

Oczywiście implementacja i sposób użycia argumentów zależny od jężyka
programowania ale dotąd uzywałem zawsze (już kilkanaście lat) tego
sposobu i jest niezawodny.

--
Best regards,
RoMan mailto:roman_at_nospam_pik-net.pl


Poprzedni Następny
Wiadomość
Spis treści
From: Piotr Buczynski <pb_at_nospam_znik.eu.WYTNIJ-MNIE.org>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Tue, 15 Feb 2005 23:12:43 +0100


Użytkownik RoMan Mandziejewicz napisał:

<ciach>

Prawda, zwłaszcza że są jeszcze jakieś specjalne szczególiki wymagane w
księgowości. Ale tu miało byc zwyczajne zaokrąglenie do całkowitych, IMHO
ze zwyczajowym : część ułamkowa <0.5 - do dołu , >=0.5 - do góry.
Wtedy wystarczy np.
int Round(double value)
{
double tolow=floor(value);
if((value-tolow) < 0.5) return (int)tolow; else return (int)tolow+1 ;
}
A i tak dużo zasobów pochłania.


Hmmm.... Nie prościej: int(value + 0.5)?

Oczywiście implementacja i sposób użycia argumentów zależny od jężyka
programowania ale dotąd uzywałem zawsze (już kilkanaście lat) tego
sposobu i jest niezawodny.

A do zaokrąglania do dowolnego miejsca po przecinku taka konwersja też
sie sprawdza (oczywiście pochłania trochę liczenia ;/

float a = 1.738287;
float wynik;
int miejsce = 2;

wynik = ( ( (int) (a*pow(10,miejsce) + 0.5) )/pow(10,miejsce));

-> wynik == 1.7400

Nie miałem z tym raczej problemów, więc po co sobie komplikować życie ;-)

--
Pozdrawiam
PB

Poprzedni Następny
Wiadomość
Spis treści
Date: Tue, 15 Feb 2005 23:23:53 +0100
From: RoMan Mandziejewicz <roman_at_nospam_pik-net.pl>
Subject: Re: [avr-gcc] zaokraglanie :))


Hello Piotr,

Tuesday, February 15, 2005, 11:12:43 PM, you wrote:

[...]

Hmmm.... Nie prościej: int(value + 0.5)?

[...]

A do zaokrąglania do dowolnego miejsca po przecinku taka konwersja też
sie sprawdza (oczywiście pochłania trochę liczenia ;/

Mało tego - mozna jej uzyć do zaokrąglania niekoniecznie do liczby
miejsc po przecinku...
Implementacja moja - ciekaw jestem, kto rozpozna język ;-) Funkcja
zawiera błąd przy zaokragleniu w górę - działanie swiadome, wynikające
z wiedzy, że zaokrąglana liczba nie ma aż tylu miejsc po przecinku.
Napisana 11.07.1993 roku ;-)

Parametry:
KWOTA - liczba do zaokrąglenia
DO - z jaką dokładnością zaokrąglamy (2 miejsca po przecinku to
0.01, z dokładnością do tysięcy: 1000) - bardzo ciekawe efekty
występują przy stosowaniu ciekawych liczb ;->

===8<===
PARAMETERS KWOTA, DO, METODA

DO CASE
CASE M.METODA = 1 && ZAOKRĄGENIE KSIĘGOWE
M.METODA = 0.5
CASE M.METODA = 2 && ZAOKRĄGLENIE W GÓRĘ
M.METODA = 0.999999
CASE M.METODA = 3 && ZAOKRĄGLENIE W DÓŁ
M.METODA = 0
ENDCASE

RETURN SIGN(M.KWOTA) * M.DO * INT(ABS(M.KWOTA/M.DO)+M.METODA)
===8<===

--
Best regards,
RoMan mailto:roman_at_nospam_pik-net.pl


Poprzedni Następny
Wiadomość
Spis treści
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: 15 Feb 2005 23:56:54 +0100


On Tue, 15 Feb 2005 22:49:49 +0100, RoMan Mandziejewicz <roman_at_nospam_pik-net.pl> wrote:
[.....]
ale dotąd uzywałem zawsze (już kilkanaście lat) tego sposobu i jest
niezawodny.
Dla liczb ujemnych równiez jest niezawodny? :-)

Regards,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein

Poprzedni Następny
Wiadomość
Spis treści
Date: Wed, 16 Feb 2005 00:02:15 +0100
From: RoMan Mandziejewicz <roman_at_nospam_pik-net.pl>
Subject: Re: [avr-gcc] zaokraglanie :))


Hello Jan,

Tuesday, February 15, 2005, 11:56:54 PM, you wrote:

ale dotąd uzywałem zawsze (już kilkanaście lat) tego sposobu i jest
niezawodny.
Dla liczb ujemnych równiez jest niezawodny? :-)

Trochę dalej podałem konkretną funkcję... Sprawdź.

--
Best regards,
RoMan mailto:roman_at_nospam_pik-net.pl


Poprzedni Następny
Wiadomość
Spis treści
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: 16 Feb 2005 00:43:26 +0100


On Wed, 16 Feb 2005 00:02:15 +0100, RoMan Mandziejewicz <roman_at_nospam_pik-net.pl> wrote:
Hello Jan,

Tuesday, February 15, 2005, 11:56:54 PM, you wrote:

ale dotąd uzywałem zawsze (już kilkanaście lat) tego sposobu i jest
niezawodny.
Dla liczb ujemnych równiez jest niezawodny? :-)

Trochę dalej podałem konkretną funkcję... Sprawdź.
Podana funkcja implementuje coś innego niż int(value + 0.5).

Regards,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein

Poprzedni Następny
Wiadomość
Spis treści
From: Jurek Szczesiul <jerzy.szczesiul_at_nospam_wycin.ep.com.pl>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Wed, 16 Feb 2005 00:07:02 +0100


Tue, 15 Feb 2005 22:49:49 +0100, na pl.misc.elektronika, RoMan
Mandziejewicz napisał(a):


Hmmm.... Nie prościej: int(value + 0.5)?


Pewnie , że prościej.
Nie ma to jak sobie pokomplikować życie ;-[

--
Pozdrowienia
Jurek Szczesiul

Poprzedni Następny
Wiadomość
Spis treści
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: 15 Feb 2005 23:38:06 +0100


On Tue, 15 Feb 2005 22:44:47 +0100, Jurek Szczesiul <jerzy.szczesiul_at_nospam_wycin.ep.com.pl> wrote:
[.....]
Prawda, zwłaszcza że są jeszcze jakieś specjalne szczególiki wymagane w
księgowości. Ale tu miało byc zwyczajne zaokrąglenie do całkowitych, IMHO
ze zwyczajowym : część ułamkowa <0.5 - do dołu , >=0.5 - do góry.
Wtedy wystarczy np.

int Round(double value)
{
double tolow=floor(value);
if((value-tolow) < 0.5) return (int)tolow; else return (int)tolow+1 ;
}

A i tak dużo zasobów pochłania.
A próbowaleś przynajmniej sprawdzić jak rozwiązanie Waldka zadziała
np. dla 1.49, 1.50 i 1.51? :-) A jest mniej kosztowne - tylko jedno
dodawanie zmiennoprzecinkowe. Problem jest taki, że dla liczb ujemnych
będzie działać niekoniecznie tak, jakbyśmy tego oczekiwali. :-) Twoje
zdaje się również będzie działać w podobny sposób. :-)

Regards,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein

Poprzedni Następny
Wiadomość
Spis treści
From: Jurek Szczesiul <jerzy.szczesiul_at_nospam_wycin.ep.com.pl>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Wed, 16 Feb 2005 00:12:18 +0100


15 Feb 2005 23:38:06 +0100, na pl.misc.elektronika, Jan Dubiec napisał(a):

A próbowaleś przynajmniej sprawdzić jak rozwiązanie Waldka zadziała
np. dla 1.49, 1.50 i 1.51? :-)

Jasne, że spróbowałem - tylko oko krzywo spojrzało na wynik ;-[

--
Pozdrowienia
Jurek Szczesiul

Poprzedni Następny
Wiadomość
Spis treści
From: Piotr Buczynski <pb_at_nospam_znik.eu.WYTNIJ-MNIE.org>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Tue, 15 Feb 2005 22:51:04 +0100


Użytkownik Łukasz Góralczyk napisał:

mam liczbe zmienno przecinkowa i chcialbym ja
zamienic na liczbe calkowita, jednak z zachowaniem
zasad zaokraglania. Jaka funkcja to czyni?


(int) (a + 0.5), na przykład


#include <stdio.h>
int main( void )
{
double a=0.9999, b=1.0000;
printf( "%.4lf + %.4lf = %d\n", a, b, (int) (a+b) );
return 0;
}

Co otrzymamy w wyniku? Oczywiście, że jeden!

No oczywiście.. 1+0.999 = 1.9999, ale że konwersja (int) ucina po prostu
końcówkę to dostajemy 1. Gdyby zrobić tak jak podane wyżej: (int)
(a+b+0.5) byłby chyba dobry wynik ?!?

--
Pozdrawiam
PB

Poprzedni Następny
Wiadomość
Spis treści
From: =?ISO-8859-2?Q?=A3ukasz_G=F3ralczyk?= <lukasz_at_nospam_goraNOSPAMlczyk.com>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Wed, 16 Feb 2005 09:52:18 +0100


Piotr Buczynski wrote:
[ciach]
No oczywiście.. 1+0.999 = 1.9999, ale że konwersja (int) ucina po prostu
końcówkę to dostajemy 1. Gdyby zrobić tak jak podane wyżej: (int)
(a+b+0.5) byłby chyba dobry wynik ?!?

Umnkęło mi, że kolega postujący chciał zaokrąglenia do liczby całkowitej

A co do 0.5:

#include <stdio.h>
int main( void )
{
double a=0.1, b=1.0;
printf( "%.4lf + %.4lf = %d\n", a, b, (int) (a+b+0.5) );
return 0;
}

Powinno być 2, a jest nadal 1 :) . Pozdrawiam serdecznie.

--
Łukasz Góralczyk
http://lukasz.goralczyk.com
Usun NOSPAM z adresu email nim odpowiesz

Poprzedni Następny
Wiadomość
Spis treści
Date: Wed, 16 Feb 2005 11:06:34 +0100
From: RoMan Mandziejewicz <roman_at_nospam_pik-net.pl>
Subject: Re: [avr-gcc] zaokraglanie :))


Hello Łukasz,

Wednesday, February 16, 2005, 9:52:18 AM, you wrote:

No oczywiście.. 1+0.999 = 1.9999, ale że konwersja (int) ucina po prostu
końcówkę to dostajemy 1. Gdyby zrobić tak jak podane wyżej: (int)
(a+b+0.5) byłby chyba dobry wynik ?!?
Umnkęło mi, że kolega postujący chciał zaokrąglenia do liczby całkowitej
- to upraszcza problem (jeden z kolegów podał już poprawne rozwiązanie).
A co do 0.5:
#include <stdio.h>
int main( void )
{
double a=0.1, b=1.0;
printf( "%.4lf + %.4lf = %d\n", a, b, (int) (a+b+0.5) );
return 0;
}
Powinno być 2, a jest nadal 1 :) .

Chyba się nie wyspałeś. Zaokrąglenie 1.1 ma dać 2?

--
Best regards,
RoMan mailto:roman_at_nospam_pik-net.pl


Poprzedni Następny
Wiadomość
Spis treści
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Wed, 16 Feb 2005 11:59:11 +0100


On Wed, 16 Feb 2005 11:06:34 +0100, RoMan Mandziejewicz wrote:
Umnkęło mi, że kolega postujący chciał zaokrąglenia do liczby całkowitej
- to upraszcza problem (jeden z kolegów podał już poprawne rozwiązanie).
A co do 0.5:
#include <stdio.h>
int main( void )
{
double a=0.1, b=1.0;
printf( "%.4lf + %.4lf = %d\n", a, b, (int) (a+b+0.5) );
return 0;
}
Powinno być 2, a jest nadal 1 :) .

Chyba się nie wyspałeś. Zaokrąglenie 1.1 ma dać 2?

Ej spiochy - a 0.5 widzicie ?


To co przepraszam robi avr-gcc z -1.6 przy konwersji ?

J.



Poprzedni Następny
Wiadomość
Spis treści
Date: Wed, 16 Feb 2005 12:04:32 +0100
From: RoMan Mandziejewicz <roman_at_nospam_pik-net.pl>
Subject: Re: [avr-gcc] zaokraglanie :))


Hello J,

Wednesday, February 16, 2005, 11:59:11 AM, you wrote:

Umnkęło mi, że kolega postujący chciał zaokrąglenia do liczby całkowitej
- to upraszcza problem (jeden z kolegów podał już poprawne rozwiązanie).
A co do 0.5:
#include <stdio.h>
int main( void )
{
double a=0.1, b=1.0;
printf( "%.4lf + %.4lf = %d\n", a, b, (int) (a+b+0.5) );
return 0;
}
Powinno być 2, a jest nadal 1 :) .
Chyba się nie wyspałeś. Zaokrąglenie 1.1 ma dać 2?
Ej spiochy - a 0.5 widzicie ?

0.5 jest 'poprawką' służacą do poprawnego zaokrąglania. I jest rzeczą
oczywistą, że in(1.6) daje w wyniku 1.

[...]

--
Best regards,
RoMan mailto:roman_at_nospam_pik-net.pl


Poprzedni Następny
Wiadomość
Spis treści
From: =?ISO-8859-2?Q?=A3ukasz_G=F3ralczyk?= <lukasz_at_nospam_goraNOSPAMlczyk.com>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Wed, 16 Feb 2005 13:48:38 +0100


RoMan Mandziejewicz wrote:
0.5 jest 'poprawką' służacą do poprawnego zaokrąglania. I jest rzeczą
oczywistą, że in(1.6) daje w wyniku 1.

Aaa, racja! EOT - problem rozwiązany :) (spróbuję jeszcze znaleźć dziurę
w całym).

--
Łukasz Góralczyk
http://lukasz.goralczyk.com
Usun NOSPAM z adresu email nim odpowiesz

Poprzedni Następny
Wiadomość
Spis treści
From: =?ISO-8859-2?Q?=A3ukasz_G=F3ralczyk?= <lukasz_at_nospam_goraNOSPAMlczyk.com>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Wed, 16 Feb 2005 14:31:44 +0100


Jeszcze mała wzmianka, w końcu udało mi się napisać tak, aby to pokazać:

#include <stdio.h>

unsigned int myround(double a) { return (unsigned int) (a+0.5); }

int main( void )
{
float a=0.1, b=0.7;
printf( "%d\n", myround( (a+b)*10+0.5 ) );
return 0;
}

Ma to związek ze skończoną reprezentacją liczb, więc wychodzi 8, a nie
9, ale to już nie wina samej metody, która jest dobra. Niestety było mi
stracić sporo czasu na takim właśnie problemie (zamiast 8 wychodziło
7.(9) ).

Pozdrawiam.

--
Łukasz Góralczyk
http://lukasz.goralczyk.com
Usun NOSPAM z adresu email nim odpowiesz

Poprzedni Następny
Wiadomość
Spis treści
From: "Krzysztof Rudnik" <rudnik_at_nospam_kki.net.pl>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Wed, 16 Feb 2005 16:37:01 +0100



Użytkownik "Łukasz Góralczyk" <lukasz_at_nospam_goraNOSPAMlczyk.com> napisał w
wiadomości news:cuvi80$e43$1_at_nospam_nemesis.news.tpi.pl...
Jeszcze mała wzmianka, w końcu udało mi się napisać tak, aby to pokazać:

#include <stdio.h>

unsigned int myround(double a) { return (unsigned int) (a+0.5); }

int main( void )
{
float a=0.1, b=0.7;
printf( "%d\n", myround( (a+b)*10+0.5 ) );
return 0;
}

Ma to związek ze skończoną reprezentacją liczb, więc wychodzi 8, a nie
9, ale to już nie wina samej metody, która jest dobra. Niestety było mi
stracić sporo czasu na takim właśnie problemie (zamiast 8 wychodziło
7.(9) ).

Znowu masz jakies zacmienie - 0.1 + 0.7 to jest 0.8 wiec
dlaczego mialoby wyjsc 9?

Krzysiek Rudnik



Poprzedni Następny
Wiadomość
Spis treści
From: =?ISO-8859-2?Q?=A3ukasz_G=F3ralczyk?= <lukasz_at_nospam_goraNOSPAMlczyk.com>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Wed, 16 Feb 2005 18:52:12 +0100


Krzysztof Rudnik wrote:
Użytkownik "Łukasz Góralczyk" <lukasz_at_nospam_goraNOSPAMlczyk.com> napisał w
wiadomości news:cuvi80$e43$1_at_nospam_nemesis.news.tpi.pl...
float a=0.1, b=0.7;
printf( "%d\n", myround( (a+b)*10+0.5 ) );
Ma to związek ze skończoną reprezentacją liczb, więc wychodzi 8, a nie
9, ale to już nie wina samej metody, która jest dobra. Niestety było mi
stracić sporo czasu na takim właśnie problemie (zamiast 8 wychodziło
7.(9) ).

Znowu masz jakies zacmienie - 0.1 + 0.7 to jest 0.8 wiec
dlaczego mialoby wyjsc 9?

(0.1+0.7)*10 da 7.(9), do tego dodac 0.5 wyjdzie 8.4(9), funkcja
zaokragli to do 8 (tak liczy kompter).
W rzeczywistosci powinno byc: (0.7+0.7)*10 da 8, do tego dodac 0.5
wyjdzie 8.5, to sie zaokragla do 9 (tak liczy matematyka).

PS.
7.(9) = 7.99999...

--
Łukasz Góralczyk
http://lukasz.goralczyk.com
Usun NOSPAM z adresu email nim odpowiesz

Poprzedni Następny
Wiadomość
Spis treści
From: Waldemar <waldemar.krzok_at_nospam_t-online.de>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Thu, 17 Feb 2005 10:15:01 +0100


Łukasz Góralczyk wrote:

float a=0.1, b=0.7;
printf( "%d\n", myround( (a+b)*10+0.5 ) );
Ma to związek ze skończoną reprezentacją liczb, więc wychodzi 8, a nie
9, ale to już nie wina samej metody, która jest dobra. Niestety było mi
stracić sporo czasu na takim właśnie problemie (zamiast 8 wychodziło
7.(9) ).


Znowu masz jakies zacmienie - 0.1 + 0.7 to jest 0.8 wiec
dlaczego mialoby wyjsc 9?


(0.1+0.7)*10 da 7.(9), do tego dodac 0.5 wyjdzie 8.4(9), funkcja
zaokragli to do 8 (tak liczy kompter).
W rzeczywistosci powinno byc: (0.7+0.7)*10 da 8, do tego dodac 0.5
wyjdzie 8.5, to sie zaokragla do 9 (tak liczy matematyka).

PS.
7.(9) = 7.99999...
no bo 0.7 w komputerze nie ma dokładnej reprezentacji. Niestety na to
trzeba zwracać uwagę.

A matematycznie to 7.(9) == 8

Waldek

Poprzedni Następny
Wiadomość
Spis treści
From: Adam Jurkiewicz <sword_at_nospam_NA_DRZEWO_ajpic.zonk.pl>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Thu, 17 Feb 2005 10:31:56 +0100


Dnia 2/16/2005 6:52 PM, Użytkownik Łukasz Góralczyk napisał:

wyjdzie 8.5, to sie zaokragla do 9 (tak liczy matematyka).

Hmmm, metody numeryczne miałem dawno ale z tego co pamiętam to
8.5 będzie się zaokrąglało do 8, w górę było by wtedy jak na
dalszych nieznaczących pozycjach wystąpi coś > 0 (?)

sword

--
e-mail: sword_at_nospam_NA_DRZEWO_ajpic.zonk.pl
www: http://ajpic.zonk.pl/
gg#: 1781804

Poprzedni Następny
Wiadomość
Spis treści
From: Waldemar <waldemar.krzok_at_nospam_t-online.de>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Wed, 16 Feb 2005 11:23:30 +0100


Łukasz Góralczyk wrote:
Piotr Buczynski wrote:
[ciach]

No oczywiście.. 1+0.999 = 1.9999, ale że konwersja (int) ucina po
prostu końcówkę to dostajemy 1. Gdyby zrobić tak jak podane wyżej:
(int) (a+b+0.5) byłby chyba dobry wynik ?!?


Umnkęło mi, że kolega postujący chciał zaokrąglenia do liczby całkowitej
- to upraszcza problem (jeden z kolegów podał już poprawne rozwiązanie).

A co do 0.5:

#include <stdio.h>
int main( void )
{
double a=0.1, b=1.0;
printf( "%.4lf + %.4lf = %d\n", a, b, (int) (a+b+0.5) );
return 0;
}

Powinno być 2, a jest nadal 1 :) . Pozdrawiam serdecznie.


powinno być 1 i nadal jest 1. 1.0 + 0.1 = 1.1, zaokrąglone wychodzi 1.

Waldek

Poprzedni Następny
Wiadomość
Spis treści
From: "Pawel Kurzawa" <groups_at_nospam_kpw.qs.pl>
Subject: Re: [avr-gcc] zaokraglanie :))
Date: Wed, 16 Feb 2005 13:36:27 +0100


(int) (a + 0.5), na przykład
krotko i zwiezle !! czasem prostych rzeczy
sie nie zauwaza :))
nie rozumiem tych dysput ponizej :)
niektorzy nie doczytali mojego problemu :)
dzieki wielkie

--
--
Best regards
K_at_nospam_pW from Poland

kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------