2012-03-28 2 views
3

Как создать Nan с Python 2.5 на Windows?Nan с Python 2.5 на Windows

float('nan') завершается с ошибкой ValueError: invalid literal for float(): nan

Резюме ответов: Ни float('inf'), ни float('nan') работает с Python 2.5 и Windows. Это ошибка, которая была исправлена ​​в Python 2.6.

Если вы используете numpy, то вы можете использовать numpy.inf и numpy.nan.

Если вам нужен обходной путь без NumPy, то вы можете использовать выражение, которое переполняет например, 1e1000, чтобы получить инф и 1e1000/1e1000 или 1e1000 - 1e1000 получить нана.

ответ

3

Другой путь деления inf сам по себе:

>>> float('inf')/float('inf') 
nan 

Или в более запутанный путь, который не может работать на разных платформах (но работает вокруг этой конкретной ошибки в Python 2.5 на Windows):

>>> 1e31337/1e31337 
nan 
>>> 1e31337 - 1e31337 
nan 
+0

Я тестировал его, и он работает! Спасибо. – user763305

+0

Почему не только 1e1000/1e1000? Дело в том, что 1e1000 переполняется и дает inf, а inf/inf - nan. – user763305

+0

@user: 1e1337 выглядит мне лучше. В основном я добавил 'inf/inf', чтобы понять, почему работает вторая версия. –

0

Обновите дистрибутив Python, если это возможно. The behavior you listed is considered a bug. (примечание: Cython ссылка.)

Канонически, Python должен поддерживать это определение nan кросс-платформенным способом. Такое поведение, как представляется, было исправлено в Python 2.6 и 3.0.

(Additional reading)


Конечно, это работает в версиях Linux Питона:

$ python2.4 
Python 2.4.3 (#1, Sep 21 2011, 19:55:41) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> float('nan') 
nan 

$ python2.5 
Python 2.5.2 (r252:60911, Jun 26 2008, 10:20:40) 
[GCC 4.1.2 20070626 (Red Hat 4.1.2-14)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> float('nan') 
nan 
+0

Я не пишу приложение, я пишу библиотеку, которую я сделаю свободно доступной для других разработчиков, включая бедных душ, застрявших с Python 2.5. – user763305

+0

@ user763305 Тогда, yup, [this] (http://stackoverflow.com/a/9916007/517815) - это путь. :) – MrGomez

1

Существует уже принят ответ на этот вопрос, но я думаю следующее должен работать, если вы не хотите полагаться на переполнение и установить numpy ... (не тестировалось, поскольку у меня нет python2.5 или windows)

>>> import numpy as np 
>>> np.nan 
nan 
>>> np.inf 
inf 
+0

Это работает. Я тестировал Python 2.5 на Windows. Я обновил вопрос. – user763305