2014-10-27 3 views
-2

Я новичок в кодировании в Python, и у меня проблемы с чем-то ОЧЕНЬ основным. Я сделал поиск на этом сайте для того, чтобы числа не были равными, а только нашли что-то, связанное с Java. У меня очень простой вопрос. Почему 2.2 = 2.2, но 2.4! = 2.4? Код представлен ниже и вот скриншот выхода я получаю: https://drive.google.com/file/d/0Bz3Lwr6GHeMLR1Nwc2hJRkZWQ3M/viewПочему 2,4 не равны 2,4? Python/NumPy

import os 
import numpy 

Mmin = 2.1 
Mmax = 6.5 

Magnitude = numpy.arange(Mmin, Mmax, 0.10) 
print Magnitude 

x = Magnitude[1] 
y = 2.2 
print x 
print y 
print x == y 

a = Magnitude[3] 
b = 2.4 
print a 
print b 
print a == b 
+0

Что 'магнезии (а) 'показать? Или 'format (a, '.53f')?' –

+0

Я думаю, что может быть больше, чем 2.400000000000000004, попробуйте 'abs (a-b) <= 0.000001' –

+0

abs (a-b) <= 0.000001 появляется с ИСТИНА. (a) = 2.40000000000000004 и формат (a, '. 53f') = 2.40000000000000035527136788005009293556213378906250000 –

ответ

0

Любой язык, который хранит плавающей точки, как правило, хранят их как IEEE 32 или 64-битные двоичные файлы, которые по существу являются основанием 2 научной нотации, и поэтому никогда не будет точно «2.1» или «2.4». Как таковые, будьте очень осторожны при проведении каких-либо сравнений «==» с плавающими точками в вашем коде. Даже если числа начинаются с нуля, любое округление математической операции может отбросить вас одним LSB, нарушив ваш код.

В вашем примере лучшим способом может быть использование целых чисел, которые являются значениями с плавающей запятой 10x. Вероятно, ваш код будет быстрее. Преобразуйте в плавающие точки, когда вам нужно дать результат:

import os 
import numpy 

Mmin = 21 
Mmax = 65 

Magnitude = numpy.arange(Mmin, Mmax, 1) 
print Magnitude 

x = Magnitude[1] 
y = 22 
print x 
print y 
print x == y 

a = Magnitude[3] 
b = 24 
print a 
print b 
print a == b 

Вот пример кода, который показывает его немного яснее. Я использую 1/9, который является то, что не может быть точно выраженной в базовой 2 или основание 10 точечной нотации плавучего:

x = 1.0/9.0 

y = 0 
for i in range(1,15): 
    y += x 
    z = i * x 
    print 'y =', 
    print '%.20f'%y, 
    print ' z =', 
    print '%.20f '%z, 
    print z == y 

Выход заключается в следующем:

y = 0.11111111111111110494 z = 0.11111111111111110494 True 
y = 0.22222222222222220989 z = 0.22222222222222220989 True 
y = 0.33333333333333331483 z = 0.33333333333333331483 True 
y = 0.44444444444444441977 z = 0.44444444444444441977 True 
y = 0.55555555555555558023 z = 0.55555555555555558023 True 
y = 0.66666666666666674068 z = 0.66666666666666662966 False 
y = 0.77777777777777790114 z = 0.77777777777777767909 False 
y = 0.88888888888888906159 z = 0.88888888888888883955 False 
y = 1.00000000000000022204 z = 1.00000000000000000000 False 
y = 1.11111111111111138250 z = 1.11111111111111116045 False 
y = 1.22222222222222254295 z = 1.22222222222222209886 False 
y = 1.33333333333333370341 z = 1.33333333333333325932 False 
y = 1.44444444444444486386 z = 1.44444444444444441977 False 
y = 1.55555555555555602432 z = 1.55555555555555535818 False 
+0

Это вызывает больше вопросов, на которые он отвечает! Поэтому, я думаю, когда я импортирую данные, данные также не будут точными? Разве я не перемножу все перед импортом, чтобы у него не было десятичных знаков? –

+0

Это зависит от того, что вы хотите делать с данными. Я думаю, это будет «достаточно точно». 64-битные плавающие точки содержат большую точность. Если вы импортируете данные из файла, это, вероятно, будет строка, когда она появится. То, что вы сделаете с ней после этого, определит, что потеряется в тасовке. –

+0

Если у вас по-прежнему возникают проблемы, попробуйте задать новый вопрос, который даст более подробную информацию о том, что вы пытаетесь сделать. –

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