| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
> This is a problem in general on i386 due to the way that relatively > simple operations (such as assignment) can cause the fp size to change. > This is a very difficult problem to solve, and is present in most > compilers based on i386 chips. The best workaround is careful coding to > avoid inadvertent sensitivity or instability. This is no really a problem for me, for all practical purposes the result is the same, the difference being very small. But it still puzzles me who thought computers provided a single answer when given the same set of commands. > > I will try to find some time during the weekend to generate a > > minimal example that reproduces the problem. > > Please let me know how this goes for you. The difference seems to be related, in part, to the use of complex numbers. Here's some (quite stupid) code: ---------- Beginning of test.cpp ---------- #include <cstdio> #include <cmath> #include <ctime> #include <complex> using namespace std; const complex<double> j = complex<double>(0.0, 1.0); int main () { long i, nb = 10000000; complex<double> x, answer = 1.0; clock_t start, end; start = clock(); for(i = 0; i < nb; i++) { x = double(i)/double(nb) * M_PI - j * double(i)/double(nb) * M_PI; answer *= sin(x)*sin(x) + cos(x)*cos(x); } end = clock(); printf("Answer: %.16f + %.16fj\n", real(answer), imag(answer)); printf("number of clock ticks: %i\n", end-start); } ---------- End of test.cpp ---------- I compile it using: g++ -c test.cpp g++ -o test.exe test.o The number of clock ticks is: - GCC 3.4.5: 77481 - GCC 4.2.1-dw2: 85532 - GCC 4.3.0 alpha: 86995 If I add the -O3 flag, the number of clock ticks is: - GCC 3.4.5: 75168 - GCC 4.2.1-dw2: 36792 - GCC 4.3.0 alpha: 42741 If I replace the complex<double> by double (and adjust the code consequently), the number of clock ticks is, for all versions, approximately 17200 when using no flags, and approximately 8600 when using the -O3 flag. I'll continue investigating since this explains why 4.3.0 alpha is slower than 4.2.1, but not why it is slower than 3.4.5 when using the -O3 flag. I hope this helps, Stéphane ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ MinGW-users mailing list MinGW-users You may change your MinGW Account Options or unsubscribe at: https://lists.sourceforge.net/lists/listinfo/mingw-users
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
© 2004-2008 readlist.com