Correct way to emulate single precision floating point in python?

Question:

What’s the best way to emulate single-precision floating point in python? (Or other floating point formats for that matter?) Just use ctypes?

Asked By: Ryan

||

Answers:

numpy has a float32 type.

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

Answered By: John La Rooy

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

Answered By: Alex Martelli

how about ctypes.c_float from standard library?

Answered By: Kugel

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.

Answered By: Mark Seaborn

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

Answered By: Darren Weber
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.