Zdravim.Mam mensi problem s double.Naozaj nechapem preco, no viem ze v tejto situacii ide urcite o chybu, ktora s tymto suvisi.Aby som vas lepsie uviedol do problemu ukazem vam kod:
double vydavok=1;
double minca=0.2;
while(vydavok!=0) {
if (p<=vydavok) {
vydavok=vydavok-minca;
print("%lf",minca);
}
}
Toto je len ustrizok z celeho kodu.Proste ide len o to, aby bol vydavok vydany v danej minci.Ak by mala minca hodnotu 0.5 tak mi to funguje.No od 0.2 nizsie to nerobi nic.Nenapada niekoho preco je to s double takto? Ci sa to tam nejako nezaokruhluje a meni sa ta hodnota alebo nieco take.Dakujem
problem s datovym typom double- C
Re: problem s datovym typom double- C
Áno, má to niečo so zaokrúhľovaním. A síce problém je v tom, že v počítači sa desatiné čísla kódujú v binárnej sústave a tá je trochu rozdielna od tej "našej" desiatkovej.
Preto sa často stáva, že napríklad 0.4-0.3 nemusí byť 0.1, ale 0.100000001. A to už sa nerovná jednej.
Ak to chceš úplne pochopiť, pozri si napríklad toto video
No a ako to opraviť? Keď porovnávaš float, alebo double na rovnosť (==, alebo !=), musíš tam s tým 0.0000001 - veľmi malým číslo - počítať.
Takže porovnávaj nejako takto:
Preto sa často stáva, že napríklad 0.4-0.3 nemusí byť 0.1, ale 0.100000001. A to už sa nerovná jednej.
Ak to chceš úplne pochopiť, pozri si napríklad toto video
No a ako to opraviť? Keď porovnávaš float, alebo double na rovnosť (==, alebo !=), musíš tam s tým 0.0000001 - veľmi malým číslo - počítať.
Takže porovnávaj nejako takto:
Kód: Vybrať všetko
int is_double_equal( double a, double b )
{
double eps = 0.0000001; // tu dáš malé číslo podľa toho, akú presnosť požaduješ. Toto by ale malo stačiť
return (a >= b-eps && a <= b+eps );
}Re: problem s datovym typom double- C
Dakujem velmi pekne.Presne taku odpoved som ocakaval a dufal som ze problem nieje v mojom algoritme ale v tom ze neviem s danym datovym typom pracovat.A vdaka aj za tu funkciu, ale ta moj algoritmus nevyriesi.Nepomohlo by mi napr. len to aby som dane hodnoty zaokruhlil na 2 desatinne miesta? To by mohlo nie?
Re: problem s datovym typom double- C
Akože nevyrieši?
A na tú otázku už si môžeš odpovedať aj sám, ak si pochopil, o čo ide 
Kód: Vybrať všetko
while( !is_double_equal(vydavok, 0.0) )
{ ... }
-
harrison314
Hardcore addict
- Príspevky: 8219
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: problem s datovym typom double- C
Velmi jednoduche riesenie:
Nepocitaj to na eura, ale na centy a pouzi celociselne typy, tym odpada problem s float/double.
Na vstupe aj vystupe programu to kludne moze byt zadane ako 0.20€ ale vnutorne to bude 20.
Nepocitaj to na eura, ale na centy a pouzi celociselne typy, tym odpada problem s float/double.
Na vstupe aj vystupe programu to kludne moze byt zadane ako 0.20€ ale vnutorne to bude 20.
Re: problem s datovym typom double- C
No nefunguje mi to pri pouziti tejto funkcie.Ak to dam takto tak sa mi to zacykli aj pri 0.5.Potom som to zmenil takto ze som dal
while(vydavok/0.01>=1) {
if (minca<=vydavok) {
vydavok=vydavok-minca;
print("%lf",minca);
}
}
Tentokrat mi to uz nezacykluje a vydava to, ale chyba je v tom, ze akje hodnota vydavku napr. 0.2 tak ono mi to nevyda v tejto danej minci ale automaticky preskoci na nizsiu mincu.Cize, ak je vydavok napr. 0.2 ono to vyda takto: 0,1 0,05 0,02 0,02
//autoeditácia príspevku (09 Mar 2014, 20:07)
Vdaka.Nakoniec mi to funguje s tou funkciou.Nechapem preco mi to zo zaciatku neslo.Takze dakujem nielen za pomoc ale aj za vysvetlenie.
while(vydavok/0.01>=1) {
if (minca<=vydavok) {
vydavok=vydavok-minca;
print("%lf",minca);
}
}
Tentokrat mi to uz nezacykluje a vydava to, ale chyba je v tom, ze akje hodnota vydavku napr. 0.2 tak ono mi to nevyda v tejto danej minci ale automaticky preskoci na nizsiu mincu.Cize, ak je vydavok napr. 0.2 ono to vyda takto: 0,1 0,05 0,02 0,02
//autoeditácia príspevku (09 Mar 2014, 20:07)
Vdaka.Nakoniec mi to funguje s tou funkciou.Nechapem preco mi to zo zaciatku neslo.Takze dakujem nielen za pomoc ale aj za vysvetlenie.