Правильный способ эмулировать с плавающей точкой одинарной точности в Python? - PullRequest
23 голосов
/ 09 февраля 2010

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

Ответы [ 6 ]

28 голосов
/ 09 февраля 2010

numpy имеет тип float32.

12 голосов
/ 10 февраля 2010

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

8 голосов
/ 10 февраля 2010

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

4 голосов
/ 09 февраля 2010

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

1 голос
/ 14 апреля 2017

Можно использовать модуль Python struct для усечения 64-разрядного числа с точностью до 32-разрядного числа.

Например:

>>> x = 1.1122334455667788
>>> x
1.1122334455667788
>>> struct.unpack('f', struct.pack('f', x))[0]
1.1122334003448486

Чтобы выполнять арифметику только с 32-разрядными числами с плавающей запятой, вам необходимо применить эту операцию усечения к результату каждой арифметической операции.

0 голосов
/ 23 марта 2019

Чтобы немного расширить опцию ctypes [1]:

>>> import ctypes
>>> ctypes.sizeof(ctypes.c_int)                                                                                                                                                        
4
>>> ctypes.sizeof(ctypes.c_long)                                                                                                                                                       
8

>>> ctypes.sizeof(ctypes.c_float)                                                                                                                                                      
4
>>> ctypes.sizeof(ctypes.c_double)                                                                                                                                                     
8

С NumPy [2], например ::10000 *

>>> import numpy as np
>>> np.zeros((1,1), dtype='uint8').nbytes                                                                                                                                              
1
>>> np.zeros((1,1), dtype='uint16').nbytes                                                                                                                                             
2
>>> np.zeros((1,1), dtype='uint64').nbytes                                                                                                                                             
8
>>> np.zeros((1,1), dtype='float').nbytes  # watch out for this one
8
>>> np.zeros((1,1), dtype='float32').nbytes                                                                                                                                            
4
>>> np.zeros((1,1), dtype='float64').nbytes                                                                                                                                            
8
>>> np.zeros((1,1), dtype='single').nbytes                                                                                                                                             
4
>>> np.zeros((1,1), dtype='double').nbytes                                                                                                                                             
8

numpy.astype выполняет преобразования, например,

>>> np.zeros((1,1), dtype='double').astype('single').nbytes                                                                                                                            
4

[1] https://docs.python.org/3/library/ctypes.html#fundamental-data-types

[2] https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.dtypes.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...