2016-01-04 3 views
0

Я использую Python для чтения файла и преобразования числового значения, записанного как строка для float. Я наблюдаю странное преобразование:Преобразование из строки в поплавок числовых значений (научная нотация)

a="-5.970471694E+02" 

b = float(a) 
b 
>> -597.0471694 

bb = np.float64(a) 
bb 
>> -597.04716940000003 

e="-5.970471695E+02" 
ee = np.float64(e) 
ee 
>> -597.0471695 

ee-bb 
>> -9.9999965641472954e-08 

Что является причиной термина «0000003» в конце bb. Почему я не наблюдаю то же самое для ee. Это действительно проблема? Я думаю, что эта проблема связана с точностью с плавающей точкой, но результат, кажется, возмущен, прежде чем я начну использовать переменные ...

+3

что-то кажется неправильным с вашим примером >>> а = "- 5.970471694E + 09" >>> Ь = поплавка (а) >>> б -5970471694,0 >>> что я получаю ... addendum, я использую python 3.4.1, какую версию вы используете? –

+0

В вашем примере 'b' должен быть' -5970471694.0', а не '-597.04716940000003'. – acdr

+0

@ DanPatterson да да .... Я исправлю это !! Извините – Guuk

ответ

2

В чем причина термина «0000003» в конце bb. Почему я не наблюдаю то же самое для ee.

b и bb имеют одинаковые значения (попробовать оценки b == bb). Разница сводится к тому, как они представлены интерпретатором. По умолчанию числовые поплавки numpy отображаются с 8 цифрами после десятичной точки, тогда как поплавки Python печатаются на 13 значащих цифр (в том числе до десятичного разряда).

Это действительно проблема?

Поскольку фактические значения b и bb идентичны, то ответ почти наверняка нет. Если различия в дисплее вас беспокоят, вы можете использовать np.set_printoptions, чтобы контролировать, как numpy float представлены в интерпретаторе. Если вы используете IPython, вы также можете использовать %precision magic, чтобы контролировать, как печатаются регулярные поплавки Python.

+0

Хорошо, спасибо! Поскольку я ожидал, что эта «проблема» (а не настоящая) такая же, как и у многих научных программ, и это может привести к некоторым ошибкам округления. – Guuk

+0

Не попадайте в ловушку ошибки количества отображаемых * цифр для точности лежащего в основе значения поплавка. На 64-битной машине 'float' и' np.float64' будут 64 бит.Независимо от того, показываете ли вы их с 1 или 100 десятичными знаками, они все равно будут иметь одинаковую базовую точность и будут показывать ту же степень ошибки округления, когда вы используете их в вычислениях. –

+0

Да, я согласен с вами. Использование «десятичного» модуля может помочь увидеть десятичные знаки – Guuk

-1

Оба float и float64 используют двоичное представление числа. Оба должны сохранить приближение, вызванное преобразованием из числа с базой 10 в число с базой 2. Поплавок использует меньше бит, поэтому ошибка больше и становится видимой, когда a копируется в b. Это связано с тем, что b принимает a, включая ошибку округления без потери информации, а a содержит это значение 000..03. Другими словами, это ошибка округления от преобразования десятичного числа в двоичное число.

Смежные вопросы