Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Tom24 17. 01. 2017, 19:00:50

Název: Sčítání float proměnných v ObjC
Přispěvatel: 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.

Kód: [Vybrat]
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 :-)
Název: Re:Scitani float promennych
Přispěvatel: Kdo iv 17. 01. 2017, 19:18:39
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
Název: Re:Scitani float promennych
Přispěvatel: Kdo iv 17. 01. 2017, 19:21:45
http://rypress.com/tutorials/objective-c/data-types/nsdecimalnumber
Název: Re:Scitani float promennych
Přispěvatel: Tom24 17. 01. 2017, 19:43:25
Uz chapu! Dekuju za vysvetleni... :)
Název: Re:Sčítání float proměnných v ObjC
Přispěvatel: JmJ 18. 01. 2017, 08:51:34
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.
Název: Re:Sčítání float proměnných v ObjC
Přispěvatel: Jerry 18. 01. 2017, 11:06:18
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