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

Fernando Perez Fernando.Perez at colorado.edu
Wed Oct 26 13:56:03 CDT 2005


Charles R Harris wrote:

> Yes, I agree with this. The only problem I see is if someone wants to save
> space when taking the sqrt of an integral array. There are at least three
> possiblilities:
> 
> 1. cast the result to a float
> 2. cast the argument to a float
> 3. use a special sqrtf function
> 
> The first two options use more temporary space, take more time, and look
> uglier (IMHO). On the other hand, the needed commands are already
> implemented. The last option is clear and concise, but needs a new ufunc.

Well, while I agree with the recently posted design guideline from Guido of 
using different functions for different purposes rather than flags, this may 
be a case where a flag would be a good choice.  Especially because we already 
have a conceptual precedent for the accumulators of specifying the return type 
via a flag: a.sum(rtype=int).

Since the 'mental slot' is already in scipy's users heads for saying 'modify 
the default output of this function to accumulate/store data in a different 
type', I think it would be reasonable to offer

sqrt(a,rtype=float)

as an optional way to prevent automatic upcasting in cases where users want 
that kind of very fine level control.  This can be done uniformly across the 
library, rather than growing a zillion foof/food/foo* post-fixed forms of 
every ufunc in the library.

We would then have:

- A basic principle for how upcasting is done, driven by the idea of 
'protecting precision even at the cost of storage'.  This principle forces 
sqrt(2) to be a double and anint_array.sum() to accumulate to a wider type.

- A uniform mechanism for overriding upcasting across the library, via the 
rtype flag.  If most/all of scipy implements this, it seems like a small price 
of learning to pay for a reasonable balance between convenience, correctness 
and efficiency.

Or am I missing some usage case that this would not satisfy?

Cheers,

f




More information about the Scipy-dev mailing list