运行代码
b = 7**7
我得到b为823543
但是当我跑步
b= 823543.0**(1.0/7.0)
它给我b表示6.999999999999999
如果它像4 **(1/2)一样简单,则返回2。
我的问题是为什么python不仅仅返回完美的7?
我也这样做是为了检查数字是否可以写n可以以p ^ q的形式写,其中p> 0和q> 1是这样做的:
def isPower(self, A):
possible = 0 # Integer value to check if it is possible , 0 assuming it is false initally
if(A==1):
return 1
for i in xrange(2,A-1):
res = float(A)**(1.0/float(i)) #Check if it has sqaure root or cube root up untill A-1
if(res.is_integer()): #If taking the power gives me whole number then saying it is possible
possible = 1
break
return possible
此逻辑以更高的数字失败,例如823543,因为幂返回一个不精确的值,我该如何解决呢?
答案 0 :(得分:1)
您未使用小数-您正在使用浮点数。他们权衡准确性与速度。
尝试一下;
from decimal import Decimal
b = 7 ** 7 # 823543
a = Decimal(1) / Decimal(7)
b ** a # returns (for me) Decimal('7.000000000000000000000000004')
答案 1 :(得分:0)
为什么不round
注册
>>> b= 823543**(1/7)
>>> round(b)
7
>>>
现在您有7
(七)
答案 2 :(得分:0)
您应该阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic。
简而言之:浮点数表示为尾数和指数。像
0.1234 * 10^1
尾数是1234(如果我没记错的话,指数用2补码表示)
这意味着某些整数不能准确地表示为浮点数。
您可以将7和823543完全表示为浮点数,但我认为这不适用于1/7(手头没有纸):https://www.h-schmidt.net/FloatConverter/IEEE754.html
还要考虑如何计算n根。