Sčítání float proměnných v ObjC

Tom24

Sčítání float proměnných v ObjC
« kdy: 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 :-)
« Poslední změna: 17. 01. 2017, 21:29:26 od Petr Krčmář »


Kdo iv

Re:Scitani float promennych
« Odpověď #1 kdy: 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

Kdo iv


Tom24

Re:Scitani float promennych
« Odpověď #3 kdy: 17. 01. 2017, 19:43:25 »
Uz chapu! Dekuju za vysvetleni... :)

JmJ

  • ****
  • 309
    • Zobrazit profil
Re:Sčítání float proměnných v ObjC
« Odpověď #4 kdy: 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.


Jerry

Re:Sčítání float proměnných v ObjC
« Odpověď #5 kdy: 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