[英]Correct way to emulate single precision floating point in python?
在python中模拟单精度浮点的最佳方法是什么? (或者其他浮点格式呢?)只使用ctypes吗?
如果numpy
(其他答案的极好的建议)对您不适用(例如,因为您处于不允许任意第三方扩展的环境中),那么Python标准库中的array模块也可以-输入代码'f'
为您提供32位浮点数。 除了那些和(通常)双精度浮点数外,“其他浮点格式”没有太多内容了-您想到的是什么? (例如, gmpy
为GMP对具有更长的任意位大小的浮点数提供了适度的支持-但确实适度,例如,没有触发功能)。
标准库中的ctypes.c_float怎么样?
如果您的应用程序适合数组/矩阵,则可以将numpy与float32
可以使用Python的struct
模块将64位浮点数截断为32位浮点数的精度。
例如:
>>> x = 1.1122334455667788
>>> x
1.1122334455667788
>>> struct.unpack('f', struct.pack('f', x))[0]
1.1122334003448486
若要仅对32位浮点数进行算术运算,则需要将此截断运算应用于每个算术运算的结果。
要稍微扩展一下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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.