Re: [LAU] building a debian system for audio

From: Fons Adriaensen <fons@email-addr-hidden>
Date: Thu May 24 2007 - 00:54:21 EEST

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@email-addr-hidden
http://lists.linuxaudio.org/mailman/listinfo.cgi/linux-audio-user
Received on Thu May 24 04:15:01 2007

This archive was generated by hypermail 2.1.8 : Thu May 24 2007 - 04:15:01 EEST