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++ 实现会很好,如果没有,任何解决方案都可以。
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++ 实现会很好,如果没有,任何解决方案都可以。
也许你可以用对数做一些坏事
也许你可以找到一个库来处理大整数
这取决于所需的精度。由于 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、HPF和VPI中。)