这段代码 returns 是整数,但实际上不是,如何提高精度以显示小数?
This piece of code returns an integer but it is actually not, how do I increase the precision enough to show a decimal?
这是较大代码的一小部分。
c = (pow(1, 6) + pow(272, 6))**(1/6)
print(c)
它打印输出272,但它实际上是(272^6 + 1)的6次方根,小数点可以忽略不计,因此它只是被认为是一个整数。
如何提高精确度以显示实际答案?
谢谢。
您可以声明float,然后使用round 得到最接近的两位小数。我只是为一个小型薪酬计算程序做了这个。类似于:
'''
a = input ("Enter annual pay: ")
h = float (a) / 2080
x = round(h, 2)
print ("Hourly pay is: ")
print (x)
'''
免责声明:不确定它是否有效
基于OP的问题,this问题及其代码,对此post的评论:
这个想法是比较非常大的数字而不是小数展开很长的数字,因为 pythons 整数是无界的。
首先计算 c = a**g + b**g
然后 s = int(c ** (1/g))
.
现在,如果 (a, b, s)
是一个有效的三元组数字,那么 s**g
或 (s+1)**g
将等于 c
,因为:
- python 的
int
函数向下舍入并且
- 三元组由整数组成。
这样,我们就可以避免通过比较非常大的数字来直接比较具有长小数展开的数字,python 可以做到。
这是代码,类似于引用的网站:
def proof(n, g):
for a in range(1,n):
for b in range(a, n):
c = (pow(a, g) + pow(b, g))
s = int(c ** (1/g))
if (s**g == c):
print(f"{a},{b},{s}")
elif (s+1**g == c):
print(f"{a},{b},{s+1}")
proof(1000, 6)
由于 s+1**g
,存在一个小错误 (1, 1, 2),但除此之外,代码 应该 正常工作。
请自行核实,我对费马大定理不是很熟悉,想出解的时候可能漏掉了一些东西。
您可以使用 python 标准库中的 decimal 模块来获得任意精度:
from decimal import Decimal, getcontext
getcontext().prec = 128 # get 128 decimals
c = (pow(1, 6) + pow(272, 6)) ** (1 / 6)
print(c)
d = (Decimal(1) + Decimal(pow(272, 6))) ** Decimal((1 / 6))
print(d)
输出:
272.0
272.00000000000002730268738756987678453728427749629247405984602995282036227860028297571745987954219978888119652759507812823846641
除了其他问题,通过取 a^n+b^n 的第 n 次根并检查它不是整数来验证 FLT 从根本上是错误的,因为取 n 次根的过程会带来浮点错误.您引用的数字证据本身可能与 c
在数学上是整数一致。
例如,如果根计算可以按面值进行,那么
def f(c,n):
return c == pow(c,n) ** (1/n)
对于所有数字 c
, 应该计算为 True
,但事实并非如此。特别是 f(272,6)
的计算结果为 False
。在您的测试用例中,所讨论的 c
与整数略有不同这一事实并不表明它在数学上不是整数。有关详细信息,请参阅 Is floating point math broken?。
如果你走这条路,我建议四舍五入 c
(按照你目前的计算)到最接近的整数,然后检查是否pow(c,n) == pow(a,n) + pow(b,n)
.这样 round-off 错误将不再是一个问题,尽管浮点数表示数字的能力有限最终会让你陷入困境。对于更大的 a,b,n
值,你可能需要编写一个自定义整数根函数(使用例如二进制搜索)。在这种情况下,整数 x
的整数 n 次根被定义为满足 pow(y,n) <= x
.
的最大整数 y
这是较大代码的一小部分。
c = (pow(1, 6) + pow(272, 6))**(1/6)
print(c)
它打印输出272,但它实际上是(272^6 + 1)的6次方根,小数点可以忽略不计,因此它只是被认为是一个整数。
如何提高精确度以显示实际答案?
谢谢。
您可以声明float,然后使用round 得到最接近的两位小数。我只是为一个小型薪酬计算程序做了这个。类似于:
'''
a = input ("Enter annual pay: ")
h = float (a) / 2080
x = round(h, 2)
print ("Hourly pay is: ")
print (x)
'''
免责声明:不确定它是否有效
基于OP的问题,this问题及其代码,对此post的评论:
这个想法是比较非常大的数字而不是小数展开很长的数字,因为 pythons 整数是无界的。
首先计算 c = a**g + b**g
然后 s = int(c ** (1/g))
.
现在,如果 (a, b, s)
是一个有效的三元组数字,那么 s**g
或 (s+1)**g
将等于 c
,因为:
- python 的
int
函数向下舍入并且 - 三元组由整数组成。
这样,我们就可以避免通过比较非常大的数字来直接比较具有长小数展开的数字,python 可以做到。
这是代码,类似于引用的网站:
def proof(n, g):
for a in range(1,n):
for b in range(a, n):
c = (pow(a, g) + pow(b, g))
s = int(c ** (1/g))
if (s**g == c):
print(f"{a},{b},{s}")
elif (s+1**g == c):
print(f"{a},{b},{s+1}")
proof(1000, 6)
由于 s+1**g
,存在一个小错误 (1, 1, 2),但除此之外,代码 应该 正常工作。
请自行核实,我对费马大定理不是很熟悉,想出解的时候可能漏掉了一些东西。
您可以使用 python 标准库中的 decimal 模块来获得任意精度:
from decimal import Decimal, getcontext
getcontext().prec = 128 # get 128 decimals
c = (pow(1, 6) + pow(272, 6)) ** (1 / 6)
print(c)
d = (Decimal(1) + Decimal(pow(272, 6))) ** Decimal((1 / 6))
print(d)
输出:
272.0
272.00000000000002730268738756987678453728427749629247405984602995282036227860028297571745987954219978888119652759507812823846641
除了其他问题,通过取 a^n+b^n 的第 n 次根并检查它不是整数来验证 FLT 从根本上是错误的,因为取 n 次根的过程会带来浮点错误.您引用的数字证据本身可能与 c
在数学上是整数一致。
例如,如果根计算可以按面值进行,那么
def f(c,n):
return c == pow(c,n) ** (1/n)
对于所有数字 c
, 应该计算为 True
,但事实并非如此。特别是 f(272,6)
的计算结果为 False
。在您的测试用例中,所讨论的 c
与整数略有不同这一事实并不表明它在数学上不是整数。有关详细信息,请参阅 Is floating point math broken?。
如果你走这条路,我建议四舍五入 c
(按照你目前的计算)到最接近的整数,然后检查是否pow(c,n) == pow(a,n) + pow(b,n)
.这样 round-off 错误将不再是一个问题,尽管浮点数表示数字的能力有限最终会让你陷入困境。对于更大的 a,b,n
值,你可能需要编写一个自定义整数根函数(使用例如二进制搜索)。在这种情况下,整数 x
的整数 n 次根被定义为满足 pow(y,n) <= x
.
y