Kezdőlap › Fórumok › Programozás › Na ez mi ?
- This topic has 32 hozzászólás, 11 résztvevő, and was last updated 20 years, 3 months telt el by
tovis.
-
SzerzőBejegyzés
-
2005-03-30-07:50 #2010682
Nem jön ki az eredmény.
2005-03-30-08:11 #2010683Ez a számábrázolás hibája lesz, valószínûleg. Olyasmi, mint amikor összeadsz zsebszámológéppel 1/3-ot (0,333333…) + 2/3-ot (0,666666…) az eredmény 0,999999… lesz és nem 1 (jobb esetben persze kerekít, és a 2/3-ad utolsó jegye 7, de régebbi/egyszerûbb típusok nem). Lebegõpontos mennyiségeket épp ezért nem így kell összehasonlítani, hanem megnézni, hogy a várt értéktõl való különbsége kisebb-e egy tetszõlegesen kicsi (pl. 10E-7 nagyságrendû) epszilontól. Ha igen, a két érték azonosnak tekinthetõ. Azaz pl. if ((a*B)-c)<10E-7) esetén már valószínûleg el fogja találni a progi.
szerk: kipróbáltam az eredetit, nekem ez jött ki:
EXECUTING:
/home/gabor/teszt
Most eltal2005-03-30-08:19 #2010684Ez a számábrázolás hibája lesz, valószínûleg. Olyasmi, mint amikor összeadsz zsebszámológéppel 1/3-ot (0,333333…) + 2/3-ot (0,666666…) az eredmény 0,999999… lesz és nem 1 (jobb esetben persze kerekít, és a 2/3-ad utolsó jegye 7, de régebbi/egyszerûbb típusok nem). Lebegõpontos mennyiségeket épp ezért nem így kell összehasonlítani, hanem megnézni, hogy a várt értéktõl való különbsége kisebb-e egy tetszõlegesen kicsi (pl. 10E-7 nagyságrendû) epszilontól. Ha igen, a két érték azonosnak tekinthetõ. Azaz pl. if ((a*B)-c)<10E-7) esetén már valószínûleg el fogja találni a progi.
[align=right][snapback]126866[/snapback][/align]Kösz, valami hasonló sejtésem volt, de tovább gombolyítva a kérdést:
ha van egy adatbázis, amibe bedolgzol és az adattáblába be van állítva az, hogy egy mezõ értéke = két másik mezõ szorzatával, akkor mi a helyzet. Mert így a tábla mindig vissza fogja utasítani a bevitelt, ha bármelyik mezõ értéke törtszám.Addig eljutottam, hogy az adattábla „sok” tört szorzatát elfogadja, de van egy mágikus szám: 65.13 * 21160; ezt az istenért nem veszi be.
Csak bízok benne, hogy van valami más trivi megoldás is.
2005-03-30-08:27 #2010685Ez a számábrázolás hibája lesz, valószínûleg. Olyasmi, mint amikor összeadsz zsebszámológéppel 1/3-ot (0,333333…) + 2/3-ot (0,666666…) az eredmény 0,999999… lesz és nem 1 (jobb esetben persze kerekít, és a 2/3-ad utolsó jegye 7, de régebbi/egyszerûbb típusok nem). Lebegõpontos mennyiségeket épp ezért nem így kell összehasonlítani, hanem megnézni, hogy a várt értéktõl való különbsége kisebb-e egy tetszõlegesen kicsi (pl. 10E-7 nagyságrendû) epszilontól. Ha igen, a két érték azonosnak tekinthetõ. Azaz pl. if ((a*B)-c)<10E-7) esetén már valószínûleg el fogja találni a progi.
szerk: kipróbáltam az eredetit, nekem ez jött ki:
EXECUTING:
/home/gabor/teszt
Most eltal2005-03-30-09:06 #2010686Nekem nem jön ki, mindig hibát jelez.
De nem csak ez, hanem az ezen alapuló mûveletek mind. Pl. adatbázismûvlet fent.
Vagyis nem igazán tudom mi van….
Lehet hogy ez hardverfüggõ ? VagyOS: Enyém: Mandrake 10.1.
[align=right][snapback]126869[/snapback][/align]Ez nekem uhu 1.2 alatt van, 3.3.4-es gcc-vel. Hogy hardverfüggõ, az nem valószínû, de nem tudom, mi lehet. Adattáblákhoz (sql) meg nem értek, szóval ezt a részét passzolom. Nálad mi a program kimenete?
2005-03-30-09:09 #2010687Ez nekem uhu 1.2 alatt van, 3.3.4-es gcc-vel. Hogy hardverfüggõ, az nem valószínû, de nem tudom, mi lehet. Adattáblákhoz (sql) meg nem értek, szóval ezt a részét passzolom. Nálad mi a program kimenete?
[align=right][snapback]126872[/snapback][/align]Az, hogy Most hibáztam, tehát az a*b != c.
Hiba nincs.2005-03-30-09:09 #2010688Sajnos nem jön ki az eredmény! Mi a hiba ebben ?
main() {
double a,b,c;
a=65.14;
b=21160;
c=a*b;if((a*B)!=c)
printf(„nMost hibáztam!na:t%14.4fnb:t%14.4fnc:t%14.4fna*b:t%14.4fnn”,a,b,c,(a*B));
else
printf(„nMost eltaláltam!na:t%14.4fnb:t%14.4fnc:t%14.4fnn”,a,b,c);
}
[align=right][snapback]126859[/snapback][/align]Udv!
Code:printf(„nMost hibáztam!na:t%14.4fnb:t%14.4fnc:t%14.4fna*b:t%14.4fnn”,a,b,c,(a*b));szerintem a (a*B) kifejezes problemas. Ugyanis b=21160 (int). Nem lehet, hogy a kifejezest atkonvertalja int-re?
Ha hulyeseget mondok, szoljatok.Morzel
2005-03-30-09:19 #2010689Udv!
Code:printf(„nMost hibáztam!na:t%14.4fnb:t%14.4fnc:t%14.4fna*b:t%14.4fnn”,a,b,c,(a*b));szerintem a (a*B) kifejezes problemas. Ugyanis b=21160 (int). Nem lehet, hogy a kifejezest atkonvertalja int-re?
Ha hulyeseget mondok, szoljatok.Morzel
[align=right][snapback]126874[/snapback][/align]Szerintem itt nem lehet hülyeséget mondani amíg a megoldás nincs meg.
Az tény, ha két egész számmal végezzük a mûveletet akkor minden OK, viszont ha belép egy tört akkor van a hiba.2005-03-30-09:39 #2010690szerintem a (a*B) kifejezes problemas. Ugyanis b=21160 (int). Nem lehet, hogy a kifejezest atkonvertalja int-re?
Ha hulyeseget mondok, szoljatok.Szerintem a c/c++ ezt inkább double-á konvertálja, mivel az ‘a’ változó olyan típusú (és a kiértékelési sorrend miatt).
A hiba tényleg a számábrázolásból adódik, és platform (mármint pl intel/motorola) és valószínûleg fordító függõ is. 🙂2005-03-30-09:43 #2010691Udv!
szerintem a (a*B) kifejezes problemas. Ugyanis b=21160 (int). Nem lehet, hogy a kifejezest atkonvertalja int-re?
Ha hulyeseget mondok, szoljatok.Morzel
[align=right][snapback]126874[/snapback][/align]A b-t double-nak deklarálta, tehát nem int. Az a*b is double, mivel mindkettõ az, szerintem nem ez a gond. Viszont, amikor nem találja el, az értékek ugyanazok, mint ami nekem jött ki?
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz