Keresés

Részletes keresés

pasa_ Creative Commons License 2003.08.08 0 0 9
termeszetesen
Előzmény: alfa2 (7)
tcs Creative Commons License 2003.08.08 0 0 8
"A Pascal nem tudom miért kezeli jól ezeket a számokat"

Én a Delphi-ről azt tudom, hogy a 8 bájtos Double adatokkal legtöbbször úgy számol, hogy átalakítja a 10 bájtos Extended-dé, majd ezzel végzi el a műveleteket. Lehet, hogy a C++ Builder nem így csinálja, és máris megvan a különbség az eredmények közöt, mivel a kerekítés más pontosságon működik.

Előzmény: Tvik (0)
alfa2 Creative Commons License 2003.08.04 0 0 7
:-) Ezt Te komolyan elolvastad? :-)
Előzmény: pasa_ (6)
pasa_ Creative Commons License 2003.08.03 0 0 6
Anyam borogass...

Ezt olvasd el:

http://docs.sun.com/source/806-3568/ncg_goldberg.html

alfa2 Creative Commons License 2003.08.01 0 0 5
Koszonom az ertekes hozzaszolasokat, alighanem most is igaz a mondas, hogy "jo pap holtig tanul." :-))
Törölt nick Creative Commons License 2003.08.01 0 0 4
Még egy vicces megoldás lehet, hogy a konstansokat is ugyanolyan a műveletsorozattal állítod elő mint a vizsgálandó értéket.

Ehhez ismerni kell a fordító működését. Mert lehetnek olyan ferdítők, amelyek a konstansokkal végzett műveleteket már ferdítési időben elvégzik, lehet hogy a futási időben végzendő számítással eltérő pontossággal.

Előzmény: Tvik (0)
Törölt nick Creative Commons License 2003.08.01 0 0 3
Sevice Pack 1.0001

abs(x-y)< e

Mindig elfelejtem, hogy nem szabad kisebb-nagyobb jelet írni. :-(((

Előzmény: Törölt nick (2)
Törölt nick Creative Commons License 2003.08.01 0 0 2
Alapvetően az a probéma, hogy nem minden véges tizedes tört szám ábrázolható véges bináris törtszámként.

Arra nem tudok mit mondani, hogy a két rendszer között mért van különbség. Mivel a probléma ismert, a fordítók programozói megpróbálnak "segíteni" rajta. Ez valószinüleg különbözőképpen sikerül. :-)

(pl. minden művelet után megnézi, hogy a szám 99..99-re végződik. Ha igen, akkor felkerekít.)

A lebegőpontos számokkal való számolásnál alapelv, hogy sohasem vizsgálunk "egyenlőséget".

Kell választani egy e= 0,00000000000....00001 számot és az abs(x-y)

Közismertek a matekban pl. a

(a+b)+c=a+(b+c) és hasonló egyenlőségek. Na ezek a számítástechnikában így nem igazak. Ezekre is figyelni kell. :-(

Előzmény: alfa2 (-)
Tvik Creative Commons License 2003.08.01 0 0 1
Vagy esetleg double helyett használj float-ot, hátha az "elkeni" az eredményeket.
Előzmény: Tvik (0)
Tvik Creative Commons License 2003.08.01 0 0 0
A gond az, hogy bizonyos nem egész számokat nem lehet binárisan ábrázolni.

Pl a 0.5 binárisan kb. így néz ki: 0.1
Azért írom hogy kb., mert lebegőpontos szám lévén igazából kicsit máshogy van ábrázolva, de a lényeg ugyanaz.
A 0.25 így: 0.01
Viszont pl a 0.1-et (1/10) nem lehet véges kettedesjeggyel ábrázolni, tehát hiba lesz a számolásban.

A Pascal nem tudom miért kezeli jól ezeket a számokat, talán gyengébb pontossággal működik.

Lebegőpontos eredmények egyenlőségét nem szerencsés dolog vizsgálni. Inkább egy epszilon-tartományt szoktak vizsgálni. Vagy lehet bűvészkedni azzal, hogy felszorzol számokat hogy egészre jöjjenek ki az eredmények. (24-4)/20. Még egy vicces megoldás lehet, hogy a konstansokat is ugyanolyan a műveletsorozattal állítod elő mint a vizsgálandó értéket.

Előzmény: alfa2 (-)
alfa2 Creative Commons License 2003.08.01 0 0 topiknyitó
Udv!

Aki jaratos a temaban, azt kerem, hogy homaYOsitson fel...:-))

A problema a lebegopontos muveletekkel van C++ Builder-ben.

Adott a kovetkezo:

double a = ((0.24 - 0.04) / 0.2); Ez elvileg 1
double b = 1.0;
if (a < b) ShowMessage ("kisebb"); Ez elvileg hamis, de megis igaz

A kerdesem az, hogy ha egy muvelet eredmenye 1, akkor az double-kent ertelmezve
miert lesz 0.99999999999999 ?

Illetve, hogyan oldhato meg az, ha nekem lebegopontos szamokkal kell precizen
szamolni, ill. felteteles muveleteket vegrehajtani?

Egy kollegam most "tert at" delphi-rol C++ Builderre, es az athozott kodok eppen
ezek miatt a "hibak" miatt nem mukodnek.

Miert kezeli a Pascal jol ezeket a szamokat?

Ime egy konkret pelde, ami Delphiben mukodik, C++ -ban pedig nem:

mvalue = 0.24;
BoxWeight = 0.17;
ProdWeight = 0.07;

--- c++:

double mvalue, ProdWeight, BoxWeight;
int pcs;

pcs = (mvalue - BoxWeight) / ProdWeight; Ez itt elvileg 1 (gyakorlatilag a pcs 0 lesz, mert 0.99999999 az eredmeny)

if (mvalue >= ProdWeight + BoxWeight) Ez itt nem igaz, holott 0.24 >= 0.24 a feltetel, vagyis egyenlo

--- delphi:

var
mvalue, boxweight, prodweight : real;
pcs : integer;

pcs:=round ((mvalue-boxweight) / prodweight); Ez itt tenyleg 1, gondolom a round jol mukodik...

if mvalue >= prodweight+boxweight then Ez itt igaz, vagyis egyenlo a ket "oldal"

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!