如何在C 中以自己的100次以上的数量繁殖
How to multiply a very small number with itself more than 100 times in c++?
我正在尝试开发一个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的力量。
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 在c++中多次调用方法
- 如何从给定字符串中删除第二次和第三次出现的$
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 在多次运行中获得一致的callgrind输出
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- g++的分段错误(在NaN上使用to_string两次时)
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 输出 0 和 -0 的二次公式,与给定的项无关
- 为什么 zlib 放气初始化调用一次不起作用?
- 在 openGL 中多次绑定缓冲区
- 在一次迭代中从 txt 文件中读取多行
- 将一副牌循环100次(一副牌)
- 为什么用std :: sort()对上升阵列(1〜100,000)排序比仅使用100,000次使用的速度要快
- 如何在C 中以自己的100次以上的数量繁殖
- 如何测量程序执行100次的时间
- 在C/C++中,每100毫秒重新启动一次计时器