繁体   English   中英

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

[英]Correct way to emulate single precision floating point in python?

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

numpy具有float32类型。

如果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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM