changing rounding mode via importing libm in python 3

181 Views Asked by At

My environment: Ubuntu 18.04, Anaconda, Python 3.6

I am using following code to import libm in python via ctypes in order to change floating type environment such as rounding.

import numpy as np
import ctypes

FE_TONEAREST = 0x0000
FE_DOWNWARD = 0x0400
FE_UPWARD = 0x0800
FE_TOWARDZERO = 0x0c00


#libm = ctypes.CDLL("libm.so", ctypes.RTLD_GLOBAL)
libm = ctypes.cdll.LoadLibrary(r'/usr/lib/x86_64-linux-gnu/libm.so')

v = 1. / (1<<23)
print( repr(np.float32(1+v) - np.float32(v/2))) # prints 1.0

#change mode
libm.fesetround(FE_UPWARD)

print( repr(np.float32(1+v) - np.float32(v/2))) # prints 1.0000002

However I get following error:

Traceback (most recent call last):
  File "mode.py", line 10, in <module>
    libm = ctypes.cdll.LoadLibrary(r'/usr/lib/x86_64-linux-gnu/libm.so')
  File "/anaconda/envs/phat/lib/python3.6/ctypes/__init__.py", line 426, in LoadLibrary
    return self._dlltype(name)
  File "/anaconda/envs/phat/lib/python3.6/ctypes/__init__.py", line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /usr/lib/x86_64-linux-gnu/libm.so: invalid ELF header

libm is the default library comes with ubuntu 18.04.

Could you please advise what is the best way to import library?

Thank you.

1

There are 1 best solutions below

0
On

I have changed the library path

from

/usr/lib/x86_64-linux-gnu/libm.so

to

/lib/x86_64-linux-gnu/libm.so.6

it worked.