From: David M. C. <co...@ph...> - 2004-03-30 20:41:32
|
On Mon, Mar 29, 2004 at 06:55:57AM -0500, Todd Miller wrote: > On Sun, 2004-03-28 at 22:46, Gary Ruben wrote: > > > > >>> cos(1) > > > > 0.54030227661132813 > > > > > > > > gives a different result to cos(1.) > > <snip> > > > > Do others think precision is being lost unnecessarily? > > > > > > No. Do you have any suggestions? > > > > Yes. My problem is that numarray is not replicating the behaviour of > > the Python math module, which presumably coerces immediately to the > > float precision of the underlying platform. This is probably a > > float64 in Windows. If you don't explicitly specify that float32 is > > to be used, shouldn't the default be for a rank-0 value to > > immediately coerce ints to the same precision as the native Python > > float type on the underlying platform, since you know it will be > > coerced to that later and in the meantime you've lost precision > > because you've applied a function to a value of lower precision? > > > > I see your point and I'll talk it over with Perry unless he chimes in on > his own. I'm ambivalent: while it would be nice for the numarray > ufuncs to act as full equivalents to the Python math functions in scalar > cases, numarray has to strike a balance between managing storage space > and maintaining precision and these two goals are in conflict. I think > using an array package you have to be at least a little more aware of > storage concerns. I'll throw in a vote for 'cos(1)' coercing 1 to a (equivalent-to-) Python float. The reason is that I have 'from numarray import *' for my interactive interpreter, as I use numarray a lot in that. I would rather not have to remember to always cast my args to ufuncs to arrays. This isn't a storage space problem, per se., the question is whether cos(1) and cos(1.0) should return the same answer. Having cos(1) cast 1 to a Float32 makes numarray much less useful as a calculator -- mistakes are more likely. I'll probably switch my interpreter back to Numeric so as not to make mistakes, or I'll write a wrapper (which I'll post if I do). Whether cos([1,1,1]) and cos([1.0,1.0,1.0]) are the same I'd say is different, as there I've taken the conscious decision not to cast to an array. (And the fact that cos([1,1,1]) will return an array printed out with 'type=Float32' is a clue to what I've done.) -- |>|\/|< /--------------------------------------------------------------------------\ |David M. Cooke http://arbutus.physics.mcmaster.ca/dmc/ |co...@ph... |