sqrt: Domain error

3 views
Skip to first unread message

Baranyai László

unread,
Apr 11, 2008, 2:51:59 AM4/11/08
to bcb...@googlegroups.com
Üdv mindenki!

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

Kovács Attila Zoltán

unread,
Apr 11, 2008, 2:58:20 AM4/11/08
to bcb...@googlegroups.com
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.

Attila

Baranyai László

unread,
Apr 11, 2008, 4:58:38 AM4/11/08
to bcb...@googlegroups.com
Szia!

> 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.

Phoenix Zsigmond Istvan

unread,
Apr 11, 2008, 6:00:03 AM4/11/08
to bcb...@googlegroups.com

En csak azt tudom mondani, hogy vagy nezd meg az iteracios forrast, vagy csinalj inkabb egyet.
Egyeb irant, matematikailag nem nagyon szeretem a konyvtari fuggvenyeket, mert sokszor csak kiba xarul ganyoljak ossze, raadasul nem tudod rendesen boviteni sokszor, illetve esetleg nincs megvalositasa (FFT - Walsh-Haddamart).

Nem mellesleg, SQRT fuggvenyt egy rakatot talalhatsz masikat neten, etc, de ha csinalsz sajat megvalositast, az sem nehez (lasd: romaniaban a mai napig altalanos es kozepiskolaban oktatott eljarast, ahol 2-es csoportositasban .....).


"Baranyai László" <laszlo....@uni-corvinus.hu> írta:

________________________________________________________
Töltsd le ingyen Ákos születésnapi ajándékát a Track.hu-ról.
Reply all
Reply to author
Forward
0 new messages