在python中模拟单精度浮点的最佳方法是什么? (或者其他浮点格式?)只需使用ctypes?
答案 0 :(得分:28)
答案 1 :(得分:12)
如果numpy
(其他答案的优秀建议)不适用于您(例如,因为您所处的环境不允许任意第三方扩展),则array模块位于Python标准库也很好 - 类型代码'f'
为您提供32位浮点数。除了那些和(通常的)双精度浮动之外,“其他浮点格式”并不多 - 你有什么想法? (例如gmpy
提供GMP对具有更长,任意位大小的浮点数的适度支持 - 但它确实是适度的,例如,没有触发函数)。
答案 2 :(得分:8)
标准库中的ctypes.c_float怎么样?
答案 3 :(得分:4)
如果您的应用程序适合数组/矩阵,您可以使用numpy float32
答案 4 :(得分:1)
可以使用Python的struct
模块将64位浮点数截断为32位浮点数的精度。
例如:
>>> x = 1.1122334455667788
>>> x
1.1122334455667788
>>> struct.unpack('f', struct.pack('f', x))[0]
1.1122334003448486
要仅对32位浮点运算,您需要将此截断运算应用于每个算术运算的结果。
答案 5 :(得分:0)
在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],例如:
>>> 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