Egy érdekes jelenségbe botlottam, amit eddig nem sikerült felderíteni.
Egy iterációs számítás során a következő kódra "sqrt: Domain Error"-t
kapok, majd "Invalid float point operation" következik - bizonyos
feltételek mellett.
Környezet: (CodeGear) C++ Builder 2007 v11.0.2902.10471
Gyári install CD-ről és szervízcsomaggal is ez van.
1. x1 = x + s1*ux;
2. y1 = y + s1*uy;
3. z1 = z + s1*uz;
4. tmp = sqrt(x1*x1 + y1*y1 + z1*z1);
5. j = (int)(tmp/mySD.binres);
6. if (j < mySD.TR[it].size) mySD.TR[it].data[j] += 1;
7. it+=1;
A kódot a fenti 6. sornál állítja meg, amikor a "Break" megszakítást
választom.
Kicsit megakadtam rajta, ugyanis akárhonnan nézem, a gyökvonás során
a paraméter összeg nem lehet negatív. Min. nulla, de annak a gyöke meg
ugye nulla.
A poén benne az, hogy a hiba akkor és csak akkor jön elő, amikor az
iteráció során egy bizonyos paramétert egy konkrét értékre, vagy ahhoz
nagyon közel állítok. Ez az anizotrópia = 0.3 és az ux,uy,uz számítását
befolyásolja. A jelenség reprodukálható, és általában a pár ezredik
iterációnál jön elő.
Nézem, nézem és nem látom. A négyzetösszeg nem lehet negatív, soha.
Van valakinek ötlete?
A program egyébként térbeli mozgást szimulál.
Üdv.: Laci
--
Laszlo Baranyai <laszlo....@uni-corvinus.hu>
Corvinus University of Budapest
Attila
> Mi lenne, ha logot csinálnál, akkor látnád, hogy hol szúródik el, esetleg
> párhuzamos programozás (pl: c#, vc++, c++builder) esetén egy fájlba
> kiírva
> az eredményeket meg tudnád nézni, hogy hol keletkezik a differencia.
A megoldás kicsit szemét, ugyanis az anizotrópiábol becsült irány
koszinuszára
egynél nagyobb számot adott a függvény és abból akart:
st = sqrt(1.0 - ct*ct);
módon számolni. A "NaN"-eket visszakövetve jutottam hozzá, ez azonban
10+ sorral odébb van (és utána), mint ahol meghalt az IDE szerint. :(
Az iterációs ciklusok szépsége...
Köszönöm mindenkinek, aki gondolkodni kezdett rajta.
________________________________________________________
Töltsd le ingyen Ákos születésnapi ajándékát a Track.hu-ról.