[ Nedeljko @ 17.02.2011. 12:17 ] @
Priloženi program ne daje iste rezultate kada se kompajlira sa i bez optimizacije. Ispravan rezultat je sum=0 i on se mora dobiti shewchuk-ovim algoritmom. Međutim, "optimizacije" ga upropaste. Pokušao sam da kompajliram sa

g++ -O3 -fno-unsafe-math-optimizations -fno-associative-math -fno-reciprocal-math shewchuk.cpp


ali neće. I dalje izbacuje sumu različitu od nule. Kada kompajliram sa

g++ -O0 shewchuk.cpp


sve radi fino. Sa druge strane VC++ optimizuje kod, ali kako treba - dobija se rezultat 0. Kako ovo kompajlirati GCC-om sa optimizacijom da da se dobije ispravan rezultat?
[ Časlav Ilić @ 18.02.2011. 07:09 ] @
Kod mene sa GCC-om 4.4.5 (tačnije: Debijanov paket 4.4.5-10, amd64), obe komandne linije koje si naveo rezultuju nultom sumom. Takođe izlazi nula i kada kompilujem čisto kao
Code:
g++ -O3 shewchuk.cpp

Nenultu vrednost dobijem tek ako pokušam
Code:
g++ -O3 -funsafe-math-optimizations shewchuk.cpp

Isto se ponaša i GCC 4.3.5 (Deb. 4.3.5-4).
[ Nedeljko @ 18.02.2011. 10:04 ] @
Hvala. Ja imam verziju 4.5.0 (openSUSE 11.3) i radi kako sam naveo. Probaću noviju verziju GCC-a. Koliko vidim, izašla je verzija 4.5.2.
[ Nedeljko @ 18.02.2011. 10:19 ] @
Upravo isprobah najnoviju verziju MinGW-a (4.5.2) pod Windows-om i ima opisanu grešku.
[ Časlav Ilić @ 19.02.2011. 09:06 ] @
Onda će biti defekt u grani 4.5, koji bi mogao da prijaviš razvojnom timu. Ovde su potanko opisali kako se podnosi izveštaj o defektu: http://gcc.gnu.org/bugs/ . (Jedna stavka je i da se izgradi trenutna verzija GCC-a iz izvorne riznice i proveri na njoj, pošto ne prihvataju izveštaje na osnovu paketa treće strane; malo oštro, ali bih rekao da ima smisla za nešto poput kompilatora.)
[ Nedeljko @ 21.02.2011. 13:29 ] @
Prijavljeno.
[ Časlav Ilić @ 21.02.2011. 19:42 ] @
Vidim da je tvoj izveštaj preusmeren na drugi, i to vrlo zanimljiv. Ja, dakle, problem nisam video jer sam isprobavao na amd64 procesoru, kod kojeg GCC automatski koristi SSE za operacije u pokretnom zarezu. Sad sam probao na ne-SSE ia32 procesoru, gde GCC spada na iks87, i tamo vidim problem; reši se, kao što ti reče R. Ginter, tek kad nametnem kopiranje u memoriju (-ffloat-store) ili snizim tačnost (-mpc32; ali ne i -mpc64).

Kad bolje pogledam, i sam Šučak je u svom radu upozorio da proširena tačnost iks87 FPU-ova dovodi do kraha algoritma: „[...] the presence of extended precision internal floating-point registers, such as those on the Intel 80486 and Pentium processors [...] cause the methods described herein for determining the roundoff of an operation to fail.
[ Nedeljko @ 21.02.2011. 22:18 ] @
Dali su kao rešenje uključivanje opcije -ffloat-store sa kojom radi kako treba. Dakle, program preveden komandnom linijom

g++ -O3 -ffloat-store shewchuk.cpp


radi kako treba. E, sad, problem je što opcija -fno-unsafe-math-optimizations ne uključuje -ffloat-store.