long double return和ctypes

Aut*_*tic 9 python ctypes

我有一个返回a的交流功能long double.我想使用ctypes从python中调用这个函数,它主要起作用.设置so.func.restype = c_longdouble可以解决问题 - 除了python的float类型是c_double如此,如果返回的值大于double,但是在long double的范围内,python仍然将inf作为返回值.我是64位处理器,sizeof(long double)是16.

没有修改c代码的任何想法(例如使用十进制类或numpy)?

Ada*_*eld 1

我不确定你是否可以在不修改 C 代码的情况下做到这一点。ctypes 似乎对long doubles 的支持非常糟糕 - 你根本不能像数字一样操作它们,你所能做的就是在本机 Python 类型之间来回转换它们float

你甚至不能使用字节数组作为返回值而不是 a c_longdouble,因为 ABI - 浮点值不会%eax像正常返回值一样在寄存器或堆栈中返回,它们是通过硬件传递的 -特定的浮点寄存器。