如何在C 中以自己的100次以上的数量繁殖

How to multiply a very small number with itself more than 100 times in c++?

本文关键字:繁殖 100次 自己的      更新时间:2023-10-16

我正在尝试开发一个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相乘后,都会与X相乘。但是我不明白如何将常数乘以。请给我一个解决输出的解决方案。

这里的问题实际上不是 precision (或本身,它只是问题的一部分,但不是必需的一部分)。

这里的主要问题是 range ,结果数太小而无法在double中表示(结果指数超出了double表示的最小指数的范围)。因此,对于计算机,实际上是0。

将值乘以某个数字以使其更大的想法(即"比例")可以正常工作,然后您需要补偿结果指数。

还要注意,如果您要乘以相同的数字多次/很多次,则可以使用pow(num, N),如果n很大,它会更快。

每次将数字乘以自身时,都会增加所需的数字数量。好吧,老实说,即使从这1075年开始,我认为大部分的一半是正确的,甚至更少,其他人也会被汇合到附近的数字,这些数字可以表示为长期。要执行您想要的技巧,您需要使用一些具有任意优势数学的3rdparty库。在此处查看列表:

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

您的朋友希望您做的事情不会有太大帮助:持续的乘法将移动小数点,但不会减少评估所需的数字数量。

编辑@borgleader的解决方案看起来不错(boost:multipRecision)。

给定x = 2.45784e-05和y = 28224,您想要x^y(power)。找到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的力量。