在python中模拟单精度浮点的正确方法?

时间:2010-02-09 20:37:11

标签: python floating-point

在python中模拟单精度浮点的最佳方法是什么? (或者其他浮点格式?)只需使用ctypes?

6 个答案:

答案 0 :(得分:28)

numpyfloat32类型。

答案 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