Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的日志精度_Python_Python 3.x - Fatal编程技术网

python中的日志精度

python中的日志精度,python,python-3.x,Python,Python 3.x,下面是源代码,它检查一个数字是否可以用幂表示,但为什么n=76**89-1和n=76**89的代码会失败。如何解决此错误?对于这两个n,它给出x=log(n,2)/log(i,2)=89.0 from math import log,sqrt,floor import sys n= 76 ** 89 - 1 t=floor(sqrt(n))+1 flag=False for i in range(2,t): x=log(n,2)/log(i,2) print(x) i

下面是源代码,它检查一个数字是否可以用幂表示,但为什么
n=76**89-1
n=76**89
的代码会失败。如何解决此错误?对于这两个n,它给出
x=log(n,2)/log(i,2)=89.0

from math import log,sqrt,floor
import sys
n= 76 ** 89 - 1
t=floor(sqrt(n))+1
flag=False


for i in range(2,t):
    x=log(n,2)/log(i,2)
    print(x)
    if x-int(x)<sys.float_info.epsilon:
        print("YESSSSSSSSSSSSS!")
        flag=True
        break

if not flag:
    print("Nooooooooooooooooooo!")
来自数学导入日志、sqrt、楼层
导入系统
n=76**89-1
t=楼层(平方米(n))+1
flag=False
对于范围(2,t)内的i:
x=log(n,2)/log(i,2)
打印(x)

如果x-int(x)您的代码只查找候选项,而不检查它们是否真的匹配。 浮点数的不精确性使得像这样的一个非常大的值和这个相同的值减去一之间不能有区别

但由于python内置了无限范围整数Artimetic,您可以检查您找到的内容是否真的匹配

我的想法是:一旦你找到了幂,就把理论数字计算成幂(通过四舍五入),然后用整数计算幂,然后比较整数

from math import log,sqrt,floor
import sys
n = 76 ** 89
t=floor(sqrt(n))+1
flag=False


for i in range(2,t):
    x=log(n,i)  # faster than x=log(n,2)/log(i,2)

    if x-int(x)<sys.float_info.epsilon:
        x = int(round(x))
        r = int(round(n**(1/x)))
        print("found candidate: ",x,r)
        if n == r**x:   # exact integer comparison with initial value & found values
            print("YESSSSSSSSSSSSS!")
            flag=True
            break
        else:
            print("but not exact")

if not flag:
    print("Nooooooooooooooooooo!")
来自数学导入日志、sqrt、楼层
导入系统
n=76**89
t=楼层(平方米(n))+1
flag=False
对于范围(2,t)内的i:
x=log(n,i)#比x=log(n,2)/log(i,2)快

如果x-int(x)很好,但是real不是交互式的。既然python 3输入不执行求值,我们应该如何输入
76**89-1
246866894073450971745785355622959425741787114611499079775021437964567112287330391608406195258814546106170632976745994369855871886978793187438378698664981274034175你想做什么?您只是展示了实际问题的尾部。正如您所发现的,浮点值通常不足以进行这些计算。一旦你确定了一个候选者——compute
i**x
,并查看它是否与原始值匹配,你就可以通过做一次健全性检查来取得一些进展。@user1767754——用户似乎已经明确了他们的目标——编写一个程序来确定一个整数是否是一个精确的幂。好东西。但我无法说服自己,浮点限制也不会受到误判的影响。@OliverCharlesworth我们可能会错过一些舍入,因为舍入可能会走错方向(也许这就是你的意思,仍然需要找到案例)但我们发现的情况肯定会起作用。@Jean-FrançoisFabre——我在考虑原始的
log/log
计算——
epsilon
阈值是否足以接受所有精确幂次的结果?@OliverCharlesworth,指定一个更大的epsilon不会有什么坏处。那只会更慢。另一个问题是,
sqrt(n)
不想计算平方根:“overflowerrror:int太大,无法转换为float”。有趣的是,log是有效的,但不是sqrt。Q:log(n,i)
在浮点精度方面比
log(n,2)/log(i,2)
更好吗?我希望它更准确、更快。