Jak zaokrąglić liczbę zmiennoprzecinkową do całkowitej w avr-gcc?
[avr-gcc] zaokraglanie :))
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 ----------------
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
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
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
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
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
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
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
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
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
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
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
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
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 ;-[
- i nastąpiła wędrówka obwodnicą ;-)
--
Pozdrowienia
Jurek Szczesiul
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
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
- 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.
--
Łukasz Góralczyk
http://lukasz.goralczyk.com
Usun NOSPAM z adresu email nim odpowiesz
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
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.
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
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
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
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
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
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
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
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
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 ----------------