Формат чисел отличается в Linux и Windows версии Pycharm - PullRequest
0 голосов
/ 26 апреля 2018

Я использовал один код Python в PyCharm в Linux, и формат числа был -91,35357. Когда я использовал тот же код в PyCharm в формате Windows был -91,35356999999999. Проблема в том, что значение заключается в имени файла, который мне нужно открыть (а список файлов, которые нужно открыть, длинный).

Кто-нибудь знает возможное объяснение и горячо его исправить?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

поплавков

Всегда помните, что числа с плавающей точкой имеют ограниченную точность. Если вы думаете об этом, то должно быть ограничением того, насколько точно вы представляете число, если вы ограничиваете память 32 или 64 битами (или любым другим числом).

в Python

Python предоставляет только один тип с плавающей точкой. Числа с плавающей запятой обычно реализуются с использованием 64-битных, но все же они могут быть 64-битными в одном двоичном Python, 32-битными в другом, так что вы не можете действительно полагаться на это (однако, см. Комментарий @Mark Dickinson ниже).

Давайте проверим это. Но учтите, что, поскольку Python не предоставляет альтернативы float32 и float64, мы будем использовать другую библиотеку numpy для предоставления нам этих типов и операций:

>>> n = 1.23456789012345678901234567890 
>>> n
1.2345678901234567  
>>> numpy.float64(n)
1.2345678901234567
>>> numpy.float32(n)
1.2345679

Здесь мы видим, что Python на моем компьютере обрабатывает переменную как float64. Это уже усекает число, которое мы ввели (потому что float64 может обрабатывать только такую ​​точность).

Когда мы используем float32, точность еще больше уменьшается, и из-за усечения ближайшее число, которое мы можем представить, немного отличается.

Заключение

Разрешение с плавающей точкой ограничено. Кроме того, некоторые операции ведут себя по-разному в разных архитектурах.

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

Сравнение поплавка с другим поплавком должно выполняться с учетом возможной погрешности. Не используйте float_a == float_b, вместо этого используйте abs(float_a - float_b) < error_margin.

Полагаться на представления с плавающей точкой - это всегда плохая идея. Python иногда использует научную запись:

>>> a = 0.0000000001
>>> str(a)
'1e-10'

Вы можете получить последовательное приближение округления (т. Е. Использовать в именах файлов), но помните, что хранение и представление - это разные вещи. Этот другой поток может помочь вам: Ограничение числами до двух десятичных знаков

В общем, я бы не советовал использовать числа с плавающей точкой в ​​именах файлов или в качестве любого другого вида идентификатора.

Широта / Долгота

числа float32 не имеют достаточной точности для представления 5-го и 6-го десятичных чисел в парах широта / долгота (в зависимости от того, имеет ли целая часть одну, две или три цифры).

Если вы хотите узнать, что на самом деле происходит, проверьте эту страницу и проверьте некоторые из своих номеров: https://www.h -schmidt.net / FloatConverter / IEEE754.html

Представление

Обратите внимание, что Python округляет значения с плавающей точкой при их представлении:

>>> lat = 123.456789
>>> "{0:.6f}".format(lat)
'123.456789'
>>> "{0:.5f}".format(lat)
'123.45679'

И, как указано выше, широта / долгота не могут быть правильно представлены с помощью float32 до 6-го знака после запятой, и, кроме того, усеченные значения с плавающей запятой округляются при представлении Python:

>>> lat = 123.456789
>>> lat
123.456789
>>> "{0:.5f}".format(numpy.float64(lat))
'123.45679'
>>> "{0:.5f}".format(numpy.float32(lat))
'123.45679'
>>> "{0:.6f}".format(numpy.float32(lat))
'123.456787'

Как видите, округленная версия этого числа с плавающей точкой 32 не соответствует исходному числу с 5-го знака после запятой. Но также делает округленную версию до 5-го десятичного числа числа float64.

0 голосов
/ 26 апреля 2018

Ваш PyCharm в Linux - это просто округление вашего большого числа с плавающей запятой. Округление до ближайших 6 или 7 может решить вашу проблему, но НЕ ИСПОЛЬЗУЙТЕ ЭТО В КАЧЕСТВЕ ИМЯ ФАЙЛА.

Сохранение вашего кода постоянным в обоих случаях может иметь много объяснений:

1) 32-разрядные процессоры обрабатывают с плавающей запятой иначе, чем 64-разрядные процессоры.

2) PyCharm для Linux и Windows ведет себя по-разному для чисел с плавающей запятой, которые мы не можем точно определить, может быть PyCharm для Windows лучше оптимизирован.

редактировать 1

Пояснение к точке 1

на 32-битных процессорах все действительно выполняется внутри с 80-битной точностью. Точность действительно просто определяет, сколько из этих битов хранится в памяти. Это одна из причин, по которой различные настройки оптимизации могут незначительно изменить результаты: они изменяют степень округления с 80-битного на 32-битный или 64-битный.

редактировать 2

Вы можете использовать hashmapping для сохранения ваших данных в файлах и последующего отображения их на координаты. Пример: * +1021 *

# variable = {(long,lat):"<random_file_name>"}
cordinates_and_file ={(-92.45453534,-87.2123123):"AxdwaWAsdAwdz"}
...