On Fri, Apr 26, 2013 at 12:27:53PM +0200, Ondřej Surý wrote:
> This code from libgd2:src/gd.c:clip_1d:
>   *y1 -= m * (*x1 - mindim);
> where
>   m = (double) -0.050000
>   *x1 = -200
>   mindim = 0
>   *y1 = 15
> results in *y1 = 4, which is incorrect value, since it should be 5.

Nope. The result of "m * (*x1 - mindim)" is not 10, it is a floating
point value near 10, as 10 can't be expressed in double. So this is:
15 - 10.00000001 = 4.9999999. This converted to int is 4.

> Most simple workaround, which allows gcc to produce correct value:
>   *y1 -= (int)(m * (*x1 - mindim));

Here you force the later part to be 10.

> Assigning to some other variable also works ok:
>   int t;
>   t = m * (*x1 - mindim);
>   *y1 -= t;

The same.

> gcc-4.7 is unfortunatelly also affected.
> I just hope we don't compile the nuclear reactor controls with gcc :)

Just don't convert floating point to fixed point.

Bastian

-- 
Virtue is a relative term.
                -- Spock, "Friday's Child", stardate 3499.1


-- 
To UNSUBSCRIBE, email to debian-gcc-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/20130426104329.ga...@waldi.eu.org

Reply via email to