On Wed, May 23, 2007 at 10:33:12PM +0200, Karl Hammar wrote: > > On Wed, May 23, 2007 at 10:00:38PM +0200, Fons Adriaensen wrote: > > > I've been chasing a bug for hours this afternoon, and the conclusion > > is that apparently g++, under some conditions, is not consistent > > in the way it rounds floats to ints in a expression such as > > > > float a, b, x; > > int y; > > > > y = (int)((x - a) * b + 0.5f); > > > > I have this calculation twice, in the same source file. In one > > case it's within a for loop, in the second case it's just a single > > calculation. Both use exactly the same values for a, b, and x, yet > > the result is different (by 1). The value before the cast its something > > like 115.50424, and that gets rounded up in one case and down in the > > other. > > > > This is with -O3. Same with -O2, -O1, but OK without optimisation, and > > also OK if I use -O3 -march=pentium4. > > > > Is this to be expected, and should I use floorf() to avoid it, or is it > > something that should not happen ? > > It might not be a bug. You are not guaranteed of the same order of > evaluation of arithmetic expressions in C. If you want that you have > to use FORTRAN or assembler (maybe some other language has it also). 1. There is absolutely no ambiguity in order of execution of the statement above. - subtract a from x - multiply by b - add 0.5 - cast to int 2. In both cases the floating point result was the same. Only the case to int was different. -- FA Follie! Follie! Delirio vano è questo ! _______________________________________________ Linux-audio-user mailing list Linux-audio-user@xxxxxxxxxxxxxxxxxxxx http://lists.linuxaudio.org/mailman/listinfo.cgi/linux-audio-user