Pozdrawiam
SM
Być może dlatego:
http://pl.cpp.wikia.com/wiki/FAQ#Por.C3.B3wnanie_.28r.C3.B3wno.C5.9B.C4.87.29_liczb_zmiennopozycyjnych
--
Paweł Kierski
ne...@pkierski.net
U�ywa� liczb zmiennoprzecinkowych, rozumiej�c jak one dzia�aj� i jak je
wykorzysta�. Nie wsz�dzie si� nadaj�...
--
Kaczus
http://kaczus.republika.pl
> U�ywa� liczb zmiennoprzecinkowych, rozumiej�c jak one dzia�aj� i jak je
> wykorzysta�. Nie wsz�dzie si� nadaj�...
Tak sie sklada ze doskonale wiem jak one dzialaja, ale w C++ jestem
swiezakiem i sadzilem ze jest jakis prosty sposob na obejscie problemu tzw.
zaokraglania finansowego z wykorzystaniem podstawowych modulow. Nie chce
korzystac z dodatkowych klas typu Currency ktora rozwiazala by moj problem.
Chce poprostu wczytac liczbe 49.97 i wystwietlic ja juz jako unsigned czyli
4997. Masz jakis pomysl?
Pozdr
Sprawdzić czy sufit czy podłoga leży bliżej i bliższą zapisać do
unsigned.
Pozdrawiam
>> U�ywa� liczb zmiennoprzecinkowych, rozumiej�c jak one dzia�aj� i jak je
>> wykorzysta�. Nie wsz�dzie si� nadaj�...
>
> Tak sie sklada ze doskonale wiem jak one dzialaja,
No w�asnie kol Tomaszowi sie wydaje (mi te�), �e nie bardzo...
> ale w C++ jestem swiezakiem
Dzia�aj� tak samo, jak w innych j�zykach (o ile maj� koncepcj� floata,
czyli w przybli�eniu w j�zykach kompilowanych)
Najblizsze 49,97 jest 49,97000122 ktore ma postac binarna:
0 10000100 100 0111 1110 0001 0100 1000
czyli przypominajac:
znak 0
wykladnik 5
mantysa 1 + 0,5 + 0,03125 + 0,015625 + 0,0078125 + 0,00390625 +
0,001953125 + 0,000976563 +3,05176E-05 + 7,62939E-06 + 9,53674E-07 =
1,561562538
co daje 1,561562538 * 32 = 49,97000122
U mnie program:
float a;
int b;
std::cin >> a;
b = a * 100;
std::cout << b;
dziala zgodnie z oczekiwaniami pytajacego. Chodzi chyba o cos innego.
Pozdrawiam
Marek
Byďż˝ (wieki temu, przed netem) artykuďż˝ o 'Real Progragramers'. Otďż˝
prawdziwy programista debuguje b��dy zmiennego przecinka patrz�c w kod
szesnastkowy. Gratulacje ;)
na serio mo�esz miec racj�.
Jak nie wiadomo o co chodzi, (a tym przypadku wyj�tkowo) chodzi o
ulepszenia Borlanda. W wielu miejscach BCB nie chce szokowa� u�ytkownika
d�ugimi ci�gami zer i potem cyferka (lub seri� dziewi�tek) i dla jego
dobra mu to us�u�nie zaokr�gli. Bardzo go za to szanuj�.
Pozdrawiam
Marek
Jest. Używać 4997 od samego początku i zapomnieć o float/double.
--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:223B ]
[ 12:22:25 user up 12290 days, 0:17, 1 user, load average: 0.90, 0.28, 0.72 ]
One with God is a majority. -- Billy Graham
> Na pierszy rzut oka wydaje sie ze chodzi tu o nieznajomosc typu float.
> Ale jest male ale. 49,97 da sie niezle zapreprezentowac we typowym floacie
> czyli 32 bitowych. Watpie aby uzywano 16bitowych floatow (ogolnie to sa
> zdefiniowane). Problem ma jakies drugie dno.
>
> Najblizsze 49,97 jest 49,97000122 ktore ma postac binarna:
> 0 10000100 100 0111 1110 0001 0100 1000
Hmm.. no niby tak powinno byc, ale w Builderze wychodzi 49,969997406.
Poradzilem sobie z tym problemem obchodzac go poprzez dodanie 0,005 i
dopiero wtedy przemnozeniu przez 100.
Pozdr
#include <float.h>
i na poczatku programu:
_control87(RC_NEAR, MCW_RC);
Pozdr
Marek
Czyli nie wiesz, jak one działają w C++.
> i sadzilem ze jest jakis prosty sposob na obejscie problemu tzw.
> zaokraglania finansowego z wykorzystaniem podstawowych modulow.
C++ ma wśród typów prostych typy zmiennoprzecinkowe i całkowite.
Podstawowych modułów, które by to załatwiały nie ma.
> Nie chce
> korzystac z dodatkowych klas typu Currency ktora rozwiazala by moj problem.
> Chce poprostu wczytac liczbe 49.97 i wystwietlic ja juz jako unsigned czyli
> 4997. Masz jakis pomysl?
Zmienić język programowania na taki, który w podstawowym zestawie ma
typy do obsługi wartości finansowych. Albo przełamać się i użyć
jakiejś biblioteki w C++.
--
Paweł Kierski
ne...@pkierski.net
> No niby nic ale rece mi opadaja jesli chodzi o zachowanie precyzji.
> Z klawiatury uzywajac "cin >> SUMA" wprowadzam liczbe 49,97 do zmiennej typu
> float,
> nastepnie przeprowadzam operacje SUMA100 = SUMA * 100; i ku mojemu w SUMA100
> zamiast 4997 mam 4996.
> Czy moglby mi ktos powiedziec jak rozwiazac tak banalny problem?
P�na pora wi�c mo�e nie my�l� logicznie, ale je�eli po przecinku s� zawsze
dwa miejsca, to:
int a, b;
scanf("%d,%d", &a, &b);
printf("%d\n", a * 100 + b);
powinno za�atwi� problem.
> Czy moglby mi ktos powiedziec jak rozwiazac tak banalny problem?
P�na pora wi�c mo�e nie my�l� logicznie, ale je�eli po przecinku s� zawsze
W�a�nie powoli wymy�lasz rozwi�zanie ze sta�oprzecinkow� arytmetyk�
w obliczeniach finansowych - tu akurat liczenie w groszach, choďż˝
praktycznie stosuje siďż˝ np. setne grosza.
--
Paweďż˝ Kierski
ne...@pkierski.net
konwersje ze zmiennoprzecinkowej do całkowitej w C (i C++) działają
poprzez obcięcie części ułamkowej. Twój sposób jest prawidłowy, bo
dzięki zwiększeniu liczby o połowę progu obcięcia wprowadziłeś
zaokrąglenie. Lepiej to widać gdy zamienić kolejność działań:
const double suma = 49.97;
const int suma100 = suma * 100.0 + 0.5;
B.
Co do prawidłowości to należałoby to jeszcze skonsultować z lokalnymi
prepisami księgowymi, jeśli są to wartości dotyczące pieniędzy.
Zazwyczaj jest to coś podobnego do dodania 0.5, ale lepiej się nie
zdziwić...
--
Paweł Kierski
ne...@pkierski.net
a przepraszam, nie zauważyłem że mowa o pieniądzach. W takim kontekście
zasady zaokrąglania zależą od kontekstu operacji.
B.