[Python-Dev] Expert floats (original) (raw)
Ka-Ping Yee python-dev at zesty.ca
Tue Mar 30 19:41:40 EST 2004
- Previous message: [Python-Dev] Expert floats
- Next message: [Python-Dev] Expert floats
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On Tue, 30 Mar 2004, Tim Peters wrote:
repr(float) used to round to 12 significant digits (same as str() does ow -- repr(float) and str(float) used to be identical). So the problem was real, and so was the fix.
All right. Maybe we can make some progress. I agree that round-to-12 was a real problem. But i think we are talking about two different use cases: compiling to disk and displaying on screen.
I think we can satisfy both desires.
If i understand you right, your primary aim is to make sure the marshalled form of any floating-point number yields the closest possible binary approximation to the machine value on the original platform, even when that representation is used on a different platform. (Is that correct? Perhaps it's best if you clarify -- exactly what is the invariant you want to maintain, and what changes [in platform or otherwise] do you want the representation to withstand?)
That doesn't have to be part of repr()'s contract. (In fact, i would argue that already repr() makes no such promise.) repr() is about providing a representation for humans.
Can we agree on maximal precision for marshalling, and shortest- accurate precision for repr, so we can both be happy?
(By shortest-accurate i mean "the shortest representation that converts to the same machine number". I believe this is exactly what Andrew described as Scheme's method. If you are very concerned about this being a complex and/or slow operation, a fine compromise would be a "try-12" algorithm: if %.12g is accurate then use it, and otherwise use %.17g. This is simple, easy to implement, produces reasonable results in most cases, and has a small bound on CPU cost.)
def try_12(x):
rep = '%.12g' % x
if float(rep) == x: return rep
return '%.17g' % x
def shortest_accurate(x):
for places in range(17):
fmt = '%.' + str(places) + 'g'
rep = fmt % x
if float(rep) == x: return rep
return '%.17g' % x
-- ?!ng
- Previous message: [Python-Dev] Expert floats
- Next message: [Python-Dev] Expert floats
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]