开发者

Correct way to emulate single precision floating point in python?

开发者 https://www.devze.com 2022-12-19 12:49 出处:网络
What\'s the best way to emulate single-precision floating point in python?(Or other floating point for开发者_如何学编程mats for that matter?)Just use ctypes?numpy has a float32 type.If numpy (the exce

What's the best way to emulate single-precision floating point in python? (Or other floating point for开发者_如何学编程mats for that matter?) Just use ctypes?


numpy has a float32 type.


If numpy (the excellent suggestion of other answers) is inapplicable for you (e.g. because you're in an environment that doesn't allow arbitrary third-party extensions), the array module in Python standard library is fine too -- type code 'f' gives you 32-bit floats. Besides those and the (usual) double precision floats, there isn't much for "other floating point formats" -- what did you have in mind? (e.g. gmpy offers GMP's modest support for floats with much longer, arbitrary bit sizes -- but it's modest indeed, e.g., no trig functions).


It is possible to use Python's struct module to truncate a 64-bit float to the precision of a 32-bit float.

For example:

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

To do arithmetic only with 32-bit floats, you would need to apply this truncation operation to the result of every arithmetic operation.


how about ctypes.c_float from standard library?


If your application suits arrays/matrices, you can use numpy with float32


To expand a little on the ctypes option [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

With numpy [2], e.g.:

>>> 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 does conversions, e.g.

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

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号