Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Tom24 17. 01. 2017, 19:00:50
-
Ahoj, jsem uplny zacatecnik v programovani objC a hned v prvni lekci jsem bohuzel narazil na problem, ktery nechapu a potreboval bych ho vysvetlit. Pri scitani resp. odecitani dvou float promennych je vysledek chybny, resp. NENI PRESNY.
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
float number = 100;
//number = number + 1;
float d = 5.55;
number = number - d;
NSLog(@"Promenna number ma hodnotu %f", number);
}
return 0;
}
KONZOLE:
Promenna number ma hodnotu 94.449997
Cim je to zpusobene? Vrta mi to hlavou a dokud nevyresim/nepochopim tento (asi pro mnohe z vas trivialni) problem tak se nepohnu dal :-)
-
Ahoj, jsem uplny zacatecnik v programovani objC a hned v prvni lekci jsem bohuzel narazil na problem, ktery nechapu a potreboval bych ho vysvetlit. Pri scitani resp. odecitani dvou float promennych je vysledek chybny, resp. NENI PRESNY.
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
float number = 100;
//number = number + 1;
float d = 5.55;
number = number - d;
NSLog(@"Promenna number ma hodnotu %f", number);
}
return 0;
}
KONZOLE:
Promenna number ma hodnotu 94.449997
Cim je to zpusobene? Vrta mi to hlavou a dokud nevyresim/nepochopim tento (asi pro mnohe z vas trivialni) problem tak se nepohnu dal :-)
Jde o to ze typ float ma malou presnost (32bit), to znamena ze neumi presne reprezentovat napriklad cislo 5.55. Jde o to ze vnitrne se to nereprezentuje jako 5.55 ale pomoci mantisa a exponent a znamenkoveho bitu
viz. https://en.wikipedia.org/wiki/Floating_point#Internal_representation
Pokud by jsi pouzil double tak mas presnost vyssi vyuziva 64bit, ale i tak je treba pocitat ze jsou cisla ktera nejdou presne reprezentovat. Pokud clovek pracuje napriklad s penezi, tak je vhodnejsi pouzivat nektery s typu podporujici pevnou desetinou carku, casto se takovy typ oznacuje jako Decimal
-
http://rypress.com/tutorials/objective-c/data-types/nsdecimalnumber
-
Uz chapu! Dekuju za vysvetleni... :)
-
Neda mi to neupozornit, ze podobne chovani maji datove typy i v databazich. I databaze maji vetsinou typ pro praci bud primo s "penezi" (MONEY) nebo obecne s pevnou desetinnou carkou.
-
C++ FAQ - How accurate floating point comparison is?
http://www.softwareandfinance.com/CPP/FAQ_Floating_Point.html
Why don't floating point comparisons work?
http://prokutfaq.byethost15.com/FloatCompare
Comparing floating point numbers
http://www.cygnus-software.com/papers/comparingfloats/Comparing%20floating%20point%20numbers.htm