[Python-Dev] VAX NaN evaluations (original) (raw)

Steven D'Aprano steve at pearwood.info
Tue Nov 5 03:44:30 CET 2013


On Mon, Nov 04, 2013 at 08:47:53PM +0000, John Klos wrote: [...]

The short answer is to skip those tests on VAXen. The better answer is to patch any isnan functions to always return false on VAXen and patch any code which tries to parse, for instance, float("NaN") to use something _uncommon, such as the largest representable number (const union doubleu _infinity = { { 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } };) or something else equally rare. While code which depends on the ability to evaluate NaNs in some meaninful way will likely break on VAXen, I think this is better than raising an exception.

(I take it that emulating NANs at the object level isn't an option? That's what the Decimal class does.)

I write code that uses NANs, and if running it on a VAX would break my code, I'd rather it broke it nice and cleanly with an exception rather than by just giving the wrong result.

With an exception, I can see straight away that something is wrong, and decide the best way to deal with the lack of NANs for my application. If you helpfully "fix" it for me by returning a non-NAN number, or even an infinity, at best I'll get a failure somewhere else in the application, far from where the break actually occurred; at worst, I may never know that my application is actually generating garbage results.

I'm reminded about a quote from Chris Smith:

"I find it amusing when novice programmers believe their main job is preventing programs from crashing. ... More experienced programmers realize that correct code is great, code that crashes could use improvement, but incorrect code that doesn’t crash is a horrible nightmare."

Not to imply that you're a novice programmer (sorry for the implication) but please don't do that to your users. The Zen of Python talks about this:

py> import this The Zen of Python, by Tim Peters

[...] Errors should never pass silently.

Just to be clear, rather than dump core (which you suggested in a later email), if you cannot support NANs on VAXen, you should modify float to raise a ValueError exception. Pure Python code like float('nan') should never dump core, it should raise:

ValueError: could not convert string to float: 'nan'

-- Steven



More information about the Python-Dev mailing list