Корректный способ эмулировать плавающую точку одинарной точности в Python?

Что лучший способ состоит в том, чтобы эмулировать плавающую точку с одинарной точностью в Python? (Или другая плавающая точка форматирует в этом отношении?) Просто используют ctypes?

26
задан Ryan 9 February 2010 в 20:37
поделиться

4 ответа

numpy имеет тип float32 .

31
ответ дан 28 November 2019 в 06:44
поделиться

Во время работы приложения все его объекты хранятся в оперативной памяти. Когда вы выходите, эта память восстанавливается операционной системой, и ваша программа по существу «забывает» все, что происходило во время ее работы. Сериализация устраняет это, позволяя приложению сохранять объекты на диск, чтобы оно могло считывать их обратно при следующем запуске. Если приложение будет предоставлять какой-либо способ сохранения/совместного использования предыдущего состояния, потребуется некоторая форма сериализации.

-121--740839-

Давайте сначала определим сериализацию, а затем поговорим о том, почему она так полезна.

Сериализация просто превращает существующий объект в массив байтов. Этот массив байтов представляет класс объекта, версию объекта и внутреннее состояние объекта. Этот массив байтов может затем использоваться между JVM, выполняющими один и тот же код для передачи/чтения объекта.

Почему мы хотим сделать это?

Есть несколько причин:

  • Связь: Если у вас есть две машины, которые работают с одним и тем же кодом, и они должны общаться, то один компьютер может легко построить объект с информацией, которую он хотел бы передать, а затем сериализовать этот объект на другом компьютере. Это не лучший метод для коммуникации, но он делает работу.

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

  • Глубокая копия: Если вам нужна точная реплика объекта, и вы не хотите идти на беду написания собственного специализированного класса клонов (), просто сериализация объекта в массив байтов, а затем десериализация его в другой объект достигает этой цели.

  • Кэширование: Действительно, только приложение выше, но иногда объект занимает 10 минут, чтобы построить, но только 10 секунд, чтобы отменить сериализацию. Так что, вместо того, чтобы держать гигантский объект в памяти, просто кэшировать его в файл через сериализацию, и читать его позже, когда это необходимо.

  • Кросс-синхронизация JVM: сериализация работает в разных JVM, которые могут работать на разных архитектурах.

-121--740838-

Как насчет ctypes.c_float из стандартной библиотеки?

9
ответ дан 28 November 2019 в 06:44
поделиться

Если ваше приложение подходит для массивов / матриц, вы можете использовать numpy с float32

4
ответ дан 28 November 2019 в 06:44
поделиться

Если numpy ( отличное предложение других ответов) неприменимо для вас (например, потому что вы находитесь в среде, которая не допускает произвольных сторонних расширений), модуль array в стандартной библиотеке Python тоже подойдет - код типа 'f' дает вам 32-битные числа с плавающей запятой. Помимо этих и (обычных) чисел с плавающей запятой двойной точности, для «других форматов с плавающей запятой» не так много - что вы имели в виду? (например, gmpy предлагает скромную поддержку GMP для чисел с плавающей запятой с гораздо более длинными, произвольными размерами бит - но она действительно скромная, например, без триггерных функций).

13
ответ дан 28 November 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: