Issue 5864: format(1234.5, '.4') gives misleading result (original) (raw)

Issue5864

Created on 2009-04-28 11:38 by mark.dickinson, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
issue5864.patch mark.dickinson,2009-04-29 14:53
issue5864_v2.patch mark.dickinson,2009-04-29 16:08
Messages (16)
msg86728 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2009-04-28 11:38
In all versions of Python from 2.6 up, I get the following behaviour: >>> format(123.456, '.4') '123.5' >>> format(1234.56, '.4') '1235.0' >>> format(12345.6, '.4') '1.235e+04' The first and third results are as I expect, but the second is somewhat misleading: it gives 5 significant digits when only 4 were requested, and moreover the last digit is incorrect. I propose that Python 2.7 and Python 3.1 be changed so that the output for the second line above is '1.235e+03'. Note that in both Python and C, '%.g' formatting switches to exponential notation at 1e precisely to avoid the problem of producing more significant digits than were requested; I'm proposing that the same solution be applied for '' formatting, except that since the empty format code is always required to produce at least one digit after the decimal point, the switch should happen at 1e instead of 1e. This change should not be backported to 2.6 or 3.0 since there's a small risk of breakage (particular in doctests).
msg86742 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2009-04-28 14:06
I agree this should be changed. This: >>> format(1234.56, '.4') '1235.0' is definitely a problem.
msg86749 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2009-04-28 15:38
I think the change should be deemed a bug and backported. Nothing good can come from having version differences persist or from having the odd looking output.
msg86797 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2009-04-29 10:41
I'm working on a patch. The fix for the new-style PyOS_double_to_string using Gay's dtoa is a one-liner. The fix for the fallback code is going to take a little while longer...
msg86804 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2009-04-29 13:45
Here's a patch for py3k; backporting to trunk should be straightforward. Backporting to 2.6 may involve more work.
msg86806 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2009-04-29 14:53
Updated patch; the previous patch messed str() up.
msg86808 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2009-04-29 15:12
I'm getting an undefined _remove_trailing_zeros using a normal build (not using the fallback code). I think it's now always called.
msg86811 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2009-04-29 16:08
> I think it's now always called. I think you're right. I've moved remove_trailing_zeros further up, out of the #ifdef PY_NO_SHORT_FLOAT_REPR.
msg86816 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2009-04-29 16:51
Using the _v2 patch, I tested both with the fallback code and with Gay's code, and both work. It's sort of shocking just how much effort you had to go through! But I can't see a simpler way to do it. It looks good to me.
msg86819 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2009-04-29 18:49
Thanks, Eric. Applied to py3k in r72109. I've blocked it from release30- maint for now, since it will almost certainly not be possible to svnmerge it cleanly, but that doesn't preclude backporting it at some stage. I'll backport to trunk soon.
msg86825 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2009-04-29 20:47
Backported to trunk in r72119.
msg87863 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2009-05-16 08:36
Eric, any thoughts on whether this should be backported to 2.6 and 3.0? It looks like quite a lot of work.
msg87886 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2009-05-16 12:00
I don't see any point in backporting to 3.0 at this point. While it's definitely a problem in 2.6, it seems like a big change to make in a bugfix release. I guess I'm +0 on it.
msg90238 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2009-07-07 15:19
I'm not going to backport this to 2.6. The problem is that the fix for this issue is tied up with the corresponding change to str (str(1e11) produces '1e+11' in trunk and 100000000000.0 in release26-maint); I daren't change str() in 2.6, so backporting would mean separating out the str and format changes. I'm not opposed to the backport itself; it's just a lack of time and confidence of getting it right on my part. If anyone else wants to backport feel free.
msg90239 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2009-07-07 15:19
... and 3.0 is dead.
msg90240 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2009-07-07 15:28
I agree that backporting it to 2.6 would be nice, but it would be a huge change. There's too much risk involved. So this will just be a new feature in 2.7. It's already in Misc/NEWS, so you're all set there. I'm closing the issue, marking it as "wont fix" because it's only assigned to 2.6 currently.
History
Date User Action Args
2022-04-11 14:56:48 admin set github: 50114
2009-07-07 15:28:41 eric.smith set status: open -> closedmessages: + assignee: mark.dickinsonresolution: wont fixstage: patch review -> resolved
2009-07-07 15:19:47 mark.dickinson set messages: + versions: - Python 3.0
2009-07-07 15:19:14 mark.dickinson set assignee: mark.dickinson -> (no value)messages: +
2009-05-16 12:00:01 eric.smith set messages: +
2009-05-16 08:37:30 mark.dickinson set priority: normalversions: + Python 2.6, Python 3.0, - Python 3.1, Python 2.7
2009-05-16 08:36:23 mark.dickinson set messages: +
2009-04-29 20:47:53 mark.dickinson set messages: +
2009-04-29 18:49:52 mark.dickinson set messages: +
2009-04-29 16:51:07 eric.smith set messages: + stage: needs patch -> patch review
2009-04-29 16:08:59 mark.dickinson set files: + issue5864_v2.patchmessages: +
2009-04-29 15:12:30 eric.smith set messages: + stage: patch review -> needs patch
2009-04-29 14:54:13 mark.dickinson set stage: needs patch -> patch review
2009-04-29 14:54:04 mark.dickinson set files: - issue5864.patch
2009-04-29 14:53:56 mark.dickinson set files: + issue5864.patchmessages: +
2009-04-29 13:45:48 mark.dickinson set files: + issue5864.patchkeywords: + patchmessages: +
2009-04-29 10:41:53 mark.dickinson set assignee: mark.dickinsonmessages: +
2009-04-28 15:38:50 rhettinger set nosy: + rhettingermessages: +
2009-04-28 14:06:57 eric.smith set messages: +
2009-04-28 11:38:20 mark.dickinson create