如何在c ++中将一个非常小的数字与自身相乘超过100倍?

时间:2016-12-22 14:04:38

标签: c++ fractions

我正在尝试开发一个c ++程序,将一个数字(例如,2.45784e-05)与自身相乘28224次。乘法后,我必须在输出上做另一个任务。为了将数字与自身相乘,我编写了一个C ++程序,如下所示:

 #include<iostream>
    using namespace std;
    int main() {
        long double x = 2.45784e-05, y = 1;
        cout << "Before multiplication, x= " << x << endl;
        for (int i = 0; i < 28224; i++) {
            y = y * x;
            cout <<i+1<<". "<< "y=" << y << endl;
        }

        return 0;
    }

但是,该程序可以提供高达1075次的准确输出。之后,它给出0作为输出。结果是:

Before multiplication, x= 2.45784e-05
1. y=2.45784e-05
2. y=6.04098e-10
3. y=1.48478e-14
4. y=3.64934e-19
.
.
.
1073. y=1.15885e-4946
1074. y=3.6452e-4951
1075. y=0
1076. y=0
.
.
.
28223. y=0

我的朋友建议我每次乘以自己后,将常数乘以x。但我不明白如何将常数乘以它。请给我一个解决方案来获得输出。

3 个答案:

答案 0 :(得分:1)

每次将数字乘以自身时,都会增加所需的数字量。嗯,说实话,即使从这些1075,我认为大部分都是正确的,甚至更少,其他人将会收敛到附近的数字,可以表示为长双。要完成你想要的技巧,你需要使用一些带有任意预测数学的第三方库。看看这里的清单:

https://en.wikipedia.org/wiki/List_of_arbitrary-precision_arithmetic_software

你的朋友希望你做的事情不会有多大帮助:常数乘法会移动小数点,但不会减少评估所需的数字位数。

编辑 @ Borgleader 解决方案看起来相当不错(提升:多精度)。

答案 1 :(得分:1)

这里的问题实际上并不是精确度(或者本身,它只是问题的一部分,而不是必不可少的一部分。)

这里的主要问题是范围,结果数太小而无法在double中表示(结果指数超出{的最小指数范围{1}}代表)。所以对于计算机来说,它实际上是0。

将值乘以某个数字以使其更大(即&#34; scale&#34;)的想法可以起作用,然后您需要补偿结果指数。

另请注意,如果您想要多次/多次乘以相同的数字,则可以使用double代替,如果N很大,则速度会快得多。

答案 2 :(得分:0)

给定x = 2.45784e-05和y = 28224,你想要x ^ y(功率)。 找到s(比例),使得z = x * s,0&lt; z&lt; 1(s = 10 ^ 6) 那么你的答案是(z / s)^ y = z ^ y / s ^ y。 如果s是10 ^ 6,那么你可以将s ^ y计算为10 ^(6 * y)。

我希望z ^ y仍然溢出,但是对于更高的指数会发生 然后你可以改进这个想法。提示:尝试使用s作为2的幂。

相关问题