【发布时间】:2021-05-25 11:50:40
【问题描述】:
我的环境:Ubuntu 18.04、Anaconda、Python 3.6
我正在使用以下代码通过 ctypes 在 python 中导入 libm,以更改浮点类型环境,例如舍入。
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
但是我得到以下错误:
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 是 ubuntu 18.04 自带的默认库。
您能否建议导入库的最佳方式是什么?
谢谢。
【问题讨论】:
-
file /usr/lib/x86_64-linux-gnu/libm.so提供了什么? -
这是数学库
-
对不起,让我更清楚一点:当您在终端提示符下执行命令
file /usr/lib/x86_64-linux-gnu/libm.so时,它的输出是什么?我强烈怀疑您会发现.so文件实际上是一个文本文件(一个 ld 脚本)。 (见unix.stackexchange.com/q/403967) -
是的,我也有类似的怀疑。它既不是链接也不是很大的东西
-
-rw-r--r-- 1 根 132 Jun 4 2020 /usr/lib/x86_64-linux-gnu/libm.a -rw-r--r-- 1 根186 2020 年 6 月 4 日 /usr/lib/x86_64-linux-gnu/libm.so
标签: python-3.x floating-point rounding ctypes libm