用大的理据表示同情
xa2=2869041017039531/549755813888
xtotatives=5221
print(Rational(2869041017039531/549755813888)*5221)对于更大的一组相似的分数,当我检查不同分数的数量时,我得到了意想不到的输出。是否有一种方法可以提高理性主义的精度,比如这样的简单代码?
Edit1:
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))}")输出:
count of distinct correct: 2422
sum(correctOutput): 2882880
count of distinct incorrect: 3408
sum(incorrectOutput): 2882880.000000864干杯,杰米
发布于 2022-07-07 22:42:41
SymPy不使用像decimal这样的全局精度。每个SymPy Float对象都存储自己的精度(默认为15位)。
如果您想使用有理数,最好的办法就是完全避免浮动。这可以通过确保您的整数是SymPy整数来完成。这可以通过对以Python整数开头的值调用渐近()来实现,如
A060753 = sympify([1, 2, 3, 15, 35, 77, 1001])
A038110 = sympify([1, 1, 1, 4, 8, 16, 192])同时使用sympy.prod和sympy.gcd代替math.prod和math.gcd。这避免了这样的问题:将两个Python对象分开会产生一个int,它会丢失有关它所代表的确切rational数的信息。
如果你这样做,结果将是有理数。然后,您可以使用number.evalf()将这些数字转换为任意数量的数字浮动。
https://stackoverflow.com/questions/72890633
复制相似问题