[poppler] PDF to PPM: Page height differs between 32bit and 64bit systems

Dyweni - Poppler 7FdqWGq4fE8x at dyweni.com
Wed May 14 14:45:29 PDT 2014



On 2014-05-14 13:31, James Cloos wrote:
>>>>>> "D" == Dyweni  <- Poppler <7FdqWGq4fE8x at dyweni.com>> writes:
> 
> D> Hi,
> D> I've traced the problem back to line 501 in the same file 'pg_h = 
> pg_h
> D> * (y_resolution / 72.0);'
> 
> The %a option in printf(3) would be useful, too.
> 

I added some %a options like this:
-----
printf("x_resolution = %a\n", x_resolution);
printf("y_resolution = %a\n", y_resolution);

printf("pg_w = %a\n", pg_w);
printf("pg_h = %a\n", pg_h);

     pg_w = pg_w * (x_resolution / 72.0);
     pg_h = pg_h * (y_resolution / 72.0);

printf("pg_w = %a\n", pg_w);
printf("pg_h = %a\n", pg_h);
-----

And I get this:
----
x_resolution = 0x1.2cp+7
y_resolution = 0x1.2cp+7
pg_w = 0x1.32p+9
pg_h = 0x1.8cp+9
pg_w = 0x1.3ecp+10
pg_h = 0x1.9c80000000001p+10
----



> Rather than 32bit vs 64bit, this is likely a '387 vs ieee754 issue.
> 
> The fp math on the 387 was done with 64bit significand for any input,
> and the modern x86 processors emulate that when using the 387 
> instructions.
> 
> Anything doing the calculations on _Float64 (52+1 bit significand) will
> see more rounding issues.
> 
> I'd expect all non-x86 systems to agree with your 64bit results,
> notwithstanding whether they are 32- or 64-bit.
> 
> Given the higher internal precision of the 387 calculations, it is
> reasonably to presume tha 1650 is the more accurate result.  Which
> implies that something more complicated than ceil() is desired.
> 
> Feeding those printf("%.64f", ...)) results into printf(1), I get
> 0xc.e4p+7 vs 0xc.e400000000008p+7.
> 
> For a _Float64 that is a difference of the least significant bit.
> 
> Maybe casting the double to a float and using ceilf(3) would be the
> right solution?
> 

Switching from '(int)ceil(pg_h)' to '(int)ceilf((float)pg_h)' is 
returning 1650 on both systems.



Thanks,
Dyweni





More information about the poppler mailing list