如何取一个非常大的根?

时间:2012-10-14 01:35:32

标签: c++

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 ++实现会很好,如果没有,任何解决方案都可以。

3 个答案:

答案 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中,HPFVPI。)