[SciPy-dev] Question about 64-bit integers being cast to double precision

Stephen Walton stephen.walton at csun.edu
Mon Oct 10 11:18:27 CDT 2005

Travis Oliphant wrote:

>In scipy (as in Numeric), there is the concept of "Casting safely" to a 
>type.  This concept is used when choosing a ufunc, for example. 
>My understanding is that a 64-bit integer cannot be cast safely to a 
>double-precision floating point number, because precision is lost in the 
>conversion...The result is that on 64-bit systems, the long double type gets used a 
>lot more.   Is this acceptable? expected?   What do those of you on 
>64-bit systems think?
I am not on a 64 bit system but can give you the perspective of someone 
who's thought a lot about floating point precision in the context of 
both my research and of teaching classes on numerical analysis for 
physics majors.  To take your example, and looking at it from an 
experimentalist's viewpoint, sqrt(2) where 2 is an integer has only one 
significant figure, and so casting it to a long double seems like 
extreme overkill.  The numerical analysis community has probably had the 
greatest influence on the design of Fortran, and there sqrt(2) (2 
integer) is simply not defined.  The user must specify sqrt(2.0) to get 
a REAL result, sqrt(2.0d0) to get a DOUBLE PRECISION result.  These 
usually map to IEEE 32 and 64 bit REALs today, respectively, on 32-bit 
hardware and to IEEE 64 and 128 bit (is there such a thing?) on 64-bit 
hardware.  I imagine that if there were an integer square root function 
in Fortran, it would simply round to the nearest integer.  In addition, 
the idea of "casting safely" would, it seems to me, also require sqrt(2) 
to return a double on a 32-bit machine.

The question, I think, is part of the larger question:  to what extent 
should the language leave precision issues under the user's control, and 
to what extent should it make decisions automatically?  A lot of the 
behind-the-scenes stuff which goes on in all the Fortran routines from 
Netlib which are now part of Scipy involve using the machine precision 
to decide on step sizes and other algorithmic choices.  These choices 
become wrong if the underlying language changes precision without 
telling the user, a la C's old habit of automatically casting all floats 
to doubles.

With all that, my vote on Travis's specific question:  if conversion of 
an N-bit integer in scipy_core is required, it gets converted to an 
N-bit float.  The only cases in which precision will be lost is if the 
integer is large enough to require more than (N-e) bits for its 
representation, where e is the number of bits in the exponent of the 
floating point representation.  Those who really need to control 
precision should, in my view, create arrays of the appropriate type to 
begin with.

I suppose these sorts of questions are why there are now special purpose 
libraries for fixed precision numbers.

More information about the Scipy-dev mailing list