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

4

3 回答 3

2

也许你可以用对数做一些坏事

也许你可以找到一个库来处理大整数

于 2012-10-14T01:43:30.873 回答
2

您可以尝试使用牛顿法。在这种情况下,您需要使用任意精度算术

即您需要为任意精度数编写类。它将是尾数的组合,尾数由数字数组和指数表示,指数由整数表示。您应该实现类似于铅笔和纸方法的数字基本操作。然后你应该意识到 wiki 中描述的牛顿算法。

于 2012-10-14T01:54:48.777 回答
2

这取决于所需的精度。由于 1e100 不能完全用双精度表示,所以你有问题。

如果您愿意接受它不会产生精确的解决方案,则此方法有效。但是,我只是说 1e100 无论如何都不能完全表示为双精度数。因此,在 MATLAB 中,

exp(log(1e100)/4)
ans =
                     1e+25

好的,所以看起来 1e25 是答案,但真的是这样吗?事实上,我们真正得到的数字是:10000000000000026675773440。

一个问题是原始数字无论如何都没有准确表示。所以 1e100,当以 IEEE 格式存储时,更准确地存储为如下所示:

1.00000000000000001590289110975991804683608085639452813897813e100

为了准确地解决这个问题,您最好使用大整数形式,但大十进制形式也可以做得相当好。

因此,在 MATLAB 中,使用我的大十进制 (HPF) 形式,我们看到 1e100 精确地表示为 100 位精度。

x = hpf('1e100',100)
x =
1.e100

并且,对于 100 位精度,根是正确的。

exp(log(x)/4)
ans =
10000000000000000000000000

但实际上,要小心,因为任何浮点形式都不能准确地表示实数。更精确地说,我们看到计算出的数字实际上略有误差:

9999999999999999999999999.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999800

一个大整数形式将产生一个精确的结果,如果存在的话。因此,使用大整数形式,我们看到了预期的结果:

vpi(10)^100
ans =
    10000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000                                       

nthroot(vpi(10)^100,4)
ans =
    10000000000000000000000000

关键是,要进行所需的计算,您需要使用可以进行计算的工具。有许多这样的大十进制或大整数工具。例如,Java 有我偶尔使用的BigDecimal 和 BigInteger形式(尽管我已经编写了自己的工具,因此在 MATLAB、HPFVPI中。)

于 2012-10-14T01:59:00.977 回答