首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用理性主义的Sympy精度

使用理性主义的Sympy精度
EN

Stack Overflow用户
提问于 2022-07-06 22:51:33
回答 1查看 64关注 0票数 1

用大的理据表示同情

代码语言:javascript
复制
xa2=2869041017039531/549755813888

xtotatives=5221

print(Rational(2869041017039531/549755813888)*5221)

对于更大的一组相似的分数,当我检查不同分数的数量时,我得到了意想不到的输出。是否有一种方法可以提高理性主义的精度,比如这样的简单代码?

Edit1:

代码语言:javascript
复制
import math
import numpy as np
from collections import Counter
from sympy import Symbol, Rational, fraction
#from decimal import *

#getcontext().prec = 10000 #digits of precision for decimal


A060753=[1, 2, 3, 15, 35, 77, 1001]
A038110=[1, 1, 1, 4, 8, 16, 192]

totatives=[]

#primesList=[2,3,5,7]
#primesList=[2,3,5,7,11]
primesList=[2,3,5,7,11,13]

primeProduct=math.prod(primesList)
nToUse=len(primesList)

valuesToCheck=range(1,primeProduct)
for n in valuesToCheck:
    if math.gcd(n, primeProduct)==1 and n<primeProduct:
        totatives.append(n)

print(len(totatives))

correctOutput=[]
incorrectOutput=[]
a2=[]

k=0
totativeCount=len(totatives)
while k<totativeCount:
    #if k%round(totativeCount/50)==1:
        #print(f"loop {k+1} of {totativeCount}")
    
    a2.append(A060753[nToUse]/A038110[nToUse]*(k+1))

    correctOutput.append(A060753[nToUse]*(k+1)-A038110[nToUse]*totatives[k])
        
    incorrectOutput.append((Rational(a2[k])-Rational(totatives[k]))*A038110[nToUse])

    k+=1


print(f"count of distinct correct: {len(np.unique(correctOutput))}")
print(f"sum(correctOutput): {sum(correctOutput)}")

print(f"count of distinct incorrect: {len(np.unique(incorrectOutput))}")
print(f"sum(incorrectOutput): {float(sum(incorrectOutput))}")

输出:

代码语言:javascript
复制
count of distinct correct: 2422
sum(correctOutput): 2882880
count of distinct incorrect: 3408
sum(incorrectOutput): 2882880.000000864

干杯,杰米

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-07 22:42:41

SymPy不使用像decimal这样的全局精度。每个SymPy Float对象都存储自己的精度(默认为15位)。

如果您想使用有理数,最好的办法就是完全避免浮动。这可以通过确保您的整数是SymPy整数来完成。这可以通过对以Python整数开头的值调用渐近()来实现,如

代码语言:javascript
复制
A060753 = sympify([1, 2, 3, 15, 35, 77, 1001])
A038110 = sympify([1, 1, 1, 4, 8, 16, 192])

同时使用sympy.prodsympy.gcd代替math.prodmath.gcd。这避免了这样的问题:将两个Python对象分开会产生一个int,它会丢失有关它所代表的确切rational数的信息。

如果你这样做,结果将是有理数。然后,您可以使用number.evalf()将这些数字转换为任意数量的数字浮动。

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

https://stackoverflow.com/questions/72890633

复制
相关文章

相似问题

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