문제

나는 c 기능을 반환하는 long double.저는 이 함수에서 사용하는 파이썬 지원하는 완전,그리고 그것은 주로 작동합니다.설정 so.func.restype = c_longdouble 지 않는 점을 제외하고는 파이썬's float 형식 c_double 그래서인 경우 반환된 값보다 큰 배지만,잘의 범위 내에서는 오래 두 번,python 전 inf 로 반환 값.나는 64 비트 프로세서와 sizeof(long double) 16 개입니다.

에 대한 아이디어를 얻기위(예:를 사용하여 소수 클래스 또는 numpy)을 수정하지 않고 c 코드?

도움이 되었습니까?

해결책

나는 확실하지 않다 당신은 그것을 할 수있을 수정하지 않고 C 코드입니다.지원하는 완전하는 것은 정말 나쁜 지원 long doubles-조작할 수 없습 그들이 같은 번호가 모두에,당신이 할 수있는 모든 것은 그들을 변환하고 네이티브 float Python 유형입니다.

할 수 없더라도 사용할 바이트 배열을 반환 값으로 대신 c_longdouble, 기 때문에,ABI-부동 소수점 값에 반환되지 않습 %eax 등록하거나 스택에서 같은 정상적인 값을 반환,그들이 통과 하드웨어-특정 부동 소수점 등록합니다.

다른 팁

이 있는 경우 반환하는 기능 서브 클래스c_longdouble, 이 반환됩니다 지원하는 완전한 포장 분야이 아닌 객체를 변환하는 파이썬 float.할 수 있는 다음 추출 바이트에서 이(가 memcpy 로 c_char 배열,예를 들어)또는 통과하는 개체는 또 다른 C 기능에 대한 추가적인 처리를 수행합니다.이 snprintf 기능할 수 있는 형식 문자열로 인쇄거나 변환로 높은-정밀도 python 숫자 형식입니다.

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)

출력:

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 숫자의 정밀도에 의하여 돌리는 것을 과도하게 낙관적 인 대 long double 계산에는 인텔 프로세서에서만 있는 64 비트의 가수.당신이 사용해야 한다 %a%e/f/g 하려는 경우로 변환하는 형식을 기반으로 하지 않습니다)

필요할 경우 높은-정밀 부동 소수점에서 봐야 GMPY.

GMPY C-coded Python 확장 모듈이 있는 래핑 GMP 라이브러리를 제공하는 파이썬 코드를 빠르 multiprecision 산(정수,합리적이며,떠),random number generation,고급수론적 함수,그리고 더 많은.

GMP 담은 높은 수준의 부동 소수점 연산 기능(mpf).이 GMP 카테고리 기능을 사용하는 경우에는 C 형식이블을 제공하지 않 충분히 정밀도를 위한 응용 프로그램입니다.거기에 대해 65 는 기능이 이러한 범주에 포함됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top