[cairo] _cairo_color_compute_shorts fails with FPU set to single precision

Bill Spitzak spitzak at d2.com
Thu Aug 31 13:10:55 PDT 2006

Fabien Costantini wrote:

> Well epsilon seems useful this time because it will bug otherwise if 
> values are between [1.0-1.e-20,1.0[
> i.e: the following example:
>     int v = (int) ((1.0-1.e-20)*65536);
>     printf("val = %d\n",v);
 > returns 65536

In 64-bit doubles, 1-1e-20 is not any different from 1.0. This prints 0 
on my machine:

double f = 1.0-1e-20;
printf("%d\n", f<1);

So the code that says "if (f<1) return 65536*f; else return 65535;" 
works because it takes the second case.

In fact any numbers closer than 5.55111512313e-17 (2^-54) to 1.0 are 1.0 
in IEEE 64-bit floats.

More information about the cairo mailing list