首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >长双精度返回和ctype

长双精度返回和ctype
EN

Stack Overflow用户
提问于 2009-01-08 06:00:48
回答 3查看 2.8K关注 0票数 9

我有一个c函数,它返回一个long double。我想使用ctype从python中调用这个函数,它基本上是有效的。设置so.func.restype = c_longdouble可以解决这个问题--只不过python的float类型是一个双精度浮点数,所以如果返回值大于c_double,但完全在long double的范围内,python仍然会得到inf作为返回值。我使用的是64位处理器,而sizeof(long double)是16位。

有什么想法可以在不修改c代码的情况下解决这个问题(例如使用decimal类或numpy)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-01-08 06:56:42

如果不修改C代码,我不确定你能做到这一点。ctypes似乎对Python的支持真的很差--你根本不能像操纵数字一样操作它们,你所能做的就是在原生float long double类型之间来回转换它们。

您甚至不能使用字节数组代替c_longdouble作为返回值,因为ABI浮点值不会像普通返回值那样在%eax寄存器或堆栈中返回,而是通过特定于硬件的浮点寄存器进行传递。

票数 1
EN

Stack Overflow用户

发布于 2015-03-12 02:21:36

如果你让一个函数返回一个c_longdouble的子类,它将返回包装好的字段对象,而不是转换成一个float。然后,您可以从中提取字节(例如,将memcpy提取到c_char数组中)或将该对象传递给另一个C函数进行进一步处理。snprintf函数可以将其格式化为字符串,以便打印或转换为高精度的python数字类型。

代码语言:javascript
运行
复制
import ctypes
libc = ctypes.cdll['libc.so.6']
libm = ctypes.cdll['libm.so.6']

class my_longdouble(ctypes.c_longdouble):
    def __str__(self):
        size = 100
        buf = (ctypes.c_char * size)()
        libc.snprintf(buf, size, '%.35Le', self)
        return buf[:].rstrip('\0')

powl = libm.powl
powl.restype = my_longdouble
powl.argtypes = [ctypes.c_longdouble, ctypes.c_longdouble]

for i in range(1020,1030):
    res = powl(2,i)
    print '2**'+str(i), '=', str(res)

输出:

代码语言:javascript
运行
复制
2**1020 = 1.12355820928894744233081574424314046e+307
2**1021 = 2.24711641857789488466163148848628092e+307
2**1022 = 4.49423283715578976932326297697256183e+307
2**1023 = 8.98846567431157953864652595394512367e+307
2**1024 = 1.79769313486231590772930519078902473e+308
2**1025 = 3.59538626972463181545861038157804947e+308
2**1026 = 7.19077253944926363091722076315609893e+308
2**1027 = 1.43815450788985272618344415263121979e+309
2**1028 = 2.87630901577970545236688830526243957e+309
2**1029 = 5.75261803155941090473377661052487915e+309

(请注意,我估计的35位精度对于只有64位尾数的英特尔处理器上的long double计算过于乐观了。如果要转换为不基于小数表示的格式,则应使用%a而不是%e/f/g。)

票数 1
EN

Stack Overflow用户

发布于 2009-01-08 07:08:54

如果你需要高精度的浮点运算,可以看看GMPY。

GMPY是一个C代码的Python扩展模块,它包装了GMP库,为Python代码提供快速多精度运算(整数、有理和浮点数)、随机数生成、高级数论函数等。

GMP包含高级浮点算术函数(mpf)。如果C类型‘`double’不能为应用程序提供足够的精度,这是要使用的GMP函数类别。在这一类中大约有65个函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/423404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档