Miért sín (a C kód ellenőrző) ad hibát, ha összehasonlítjuk egy úszót egy int?

szavazat
3

Mindkettő matematikai értékek azonban az úszó nem rendelkezik nagyobb pontossággal. Ez az egyetlen oka, a hiba - a különbség a precíziós? Vagy van egy másik lehetséges (és komolyabb) probléma?

A kérdést 01/09/2008 14:02
a forrás felhasználó
Más nyelveken...                            


6 válasz

szavazat
3

Mert valószínűleg nem egy nagyon jó ötlet. Nem minden úszók lehet csonkítva ints; nem minden ints alakíthatjuk úszik.

Válaszolt 01/09/2008 14:06
a forrás felhasználó

szavazat
8

Ez azért van, mert a készlet egész értékeket nem egyezik meg a készlet lebegőpontértékeket a „int” és a „float” típusú. Például, az úszó-érték 0,5 nem egyenlő az integer beállított és egész értékének 4519245367 lehet, hogy nem létezik a halmazban az értékek egy úszó tud tárolni. Tehát a ellenőrzőt zászlók ez olyan kérdés, ellenőrizni kell a programozó.

Válaszolt 01/09/2008 14:06
a forrás felhasználó

szavazat
1

Mivel úszók nem tudja tárolni a pontos int értéket, tehát ha van két változó int i és úszó f, akkor is, ha hozzá „i = f;” összehasonlító „if (i == f)” valószínűleg nem return true.

Válaszolt 01/09/2008 14:08
a forrás felhasználó

szavazat
0

Ha kell kap körül ez (van egy jogos indok, és szívesen egyik eset sem említi a másik válaszok probléma az Ön számára), akkor csak öntött az egyik típusról a másikra.

Válaszolt 01/09/2008 14:14
a forrás felhasználó

szavazat
1

Feltételezve aláírt egészek és az IEEE lebegőpontos formátum, nagyságának egészek így ábrázolható a következők:

short  -> 15 bits
float  -> 23 bits
long   -> 31 bits
double -> 52 bits

Ezért floattetszőleges shortés doubletetszőleges long.

Válaszolt 04/09/2008 09:59
a forrás felhasználó

szavazat
2

Ennek során az összehasonlítás, egész értéket kap „támogatott”, hogy egy lebegőpontos értéket. Ezen a ponton csinálsz egy pontos egyenlőséget összehasonlítása két lebegőpontos számok, ami majdnem mindig rossz dolog.

Meg kell általában valamiféle „epszilon labda”, vagy az elfogadható értékek, és te az összehasonlítást, ha a két vaues elég közel vannak egymáshoz, hogy figyelembe kell venni az egyenlő. Szüksége van egy funkció nagyjából így:

int double_equals(double a, double b, double epsilon)
{
   return ( a > ( b - epsilon ) && a < ( b + epsilon ) );
}

Ha az alkalmazás nincs nyilvánvaló választás epszilon, majd DBL_EPSILON.

Válaszolt 08/10/2008 04:18
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more