[LAU] building a debian system for audio

Fons Adriaensen fons at kokkinizita.net
Wed May 23 17:54:21 EDT 2007


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 !





More information about the Linux-audio-user mailing list