Любой язык, который хранит плавающей точки, как правило, хранят их как 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
Что 'магнезии (а) 'показать? Или 'format (a, '.53f')?' –
Я думаю, что может быть больше, чем 2.400000000000000004, попробуйте 'abs (a-b) <= 0.000001' –
abs (a-b) <= 0.000001 появляется с ИСТИНА. (a) = 2.40000000000000004 и формат (a, '. 53f') = 2.40000000000000035527136788005009293556213378906250000 –