given x=4 and y=1296;
we need to solve for z in z^x=y;
we can calculate z=6 in various ways;
问题是如果y是一个大于10 ^ 100的非常大的数字,我该如何找到z?我显然无法将该数字存储为int,那么我将如何计算z?
C ++实现会很好,如果没有,任何解决方案都可以。
答案 0 :(得分:2)
也许你可以用对数做一些邪恶的事情
也许你可以找到一个可以处理大整数的库
答案 1 :(得分:2)
您可以尝试使用Newton's method。在这种情况下,您需要使用arbitrary-precision arithmetic。
即。你需要为任意精度数编写类。它将是尾数的组合,由数字和指数数组表示,由整数表示。您应该实现类似于铅笔纸方法的数字的基本操作。然后你应该像维基中所描述的那样认识到牛顿的算法。
答案 2 :(得分:2)
这取决于所需的准确度。由于1e100不能用双精确表示,因此存在问题。
如果您愿意接受它不会产生确切的解决方案,那么这是有效的。但是,我刚才说1e100并不完全代表双重。因此,在MATLAB中,
exp(log(1e100)/4)
ans =
1e+25
好的,所以看起来1e25就是答案,但它真的吗?事实上,我们真正得到的数字是双倍的:10000000000000026675773440。
一个问题是原始数字无论如何都没有完全代表。因此,当以IEEE格式存储时,1e100更准确地存储为如下所示:
1.00000000000000001590289110975991804683608085639452813897813e100
要准确地解决这个问题,你最好使用一个大整数形式,但是一个大的十进制形式也可以做得相当好。
因此,在MATLAB中,使用我的大十进制(HPF)形式,我们看到1e100完全以100位精度表示。
x = hpf('1e100',100)
x =
1.e100
并且,对于100位精度,根是正确的。
exp(log(x)/4)
ans =
10000000000000000000000000
实际上,请注意,因为任何浮点形式都不能完全代表实数。为了更精确,我们看到计算的数字实际上有点错误:
9999999999999999999999999.9999999999999999999999999999999999999999999999999999999999999999999999999999999999800
如果存在,则大整数形式将产生精确结果。因此,使用大整数形式,我们可以看到预期的结果:
vpi(10)^100
ans =
10000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000
nthroot(vpi(10)^100,4)
ans =
10000000000000000000000000
关键是,要进行所需的计算,您需要使用可以进行计算的工具。有很多这样的大小数或大整数工具。例如,Java有一个我偶尔使用的BigDecimal and a BigInteger形式(尽管我已经编写了自己的工具,因此在MATLAB中,HPF和VPI。)