首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当超过10^10限制时,pow函数的精度损失?

当超过10^10限制时,pow函数的精度损失?
EN

Stack Overflow用户
提问于 2020-09-25 14:08:34
回答 2查看 467关注 0票数 0

我第一次做大学的家务活,遇到了这个问题:

任务:找到所有n个元素的和,其中n是数字中数的计数(n=1,意思是1,2,3.例如,答案是45)

问题:我编写的代码已经正确地得到了所有测试答案

我想这与变量类型有关,但不太确定可能的解决方案。

代码语言:javascript
复制
#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;

int main()
{
    int n;
    double ats = 0, maxi, mini;
    cin >> n;
    maxi = pow(10, n) - 1;
    mini = pow(10, n-1) - 1;
    ats = (maxi * (maxi + 1)) / 2 - (mini * (mini + 1)) / 2;
    cout << setprecision(0) << fixed << ats;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-25 16:07:21

产生问题的主要原因是pow()函数。它适用于double,而不是int。丢失准确性是代表巨大数字的代价。解决问题的方法有三种:

  1. 对于小n,您可以创建自己的long long int pow(int x, int pow)函数。但问题是,我们甚至可以溢出long long int
  2. 使用长算术函数,如@rustyx。您可以用向量编写自己的库,也可以查找并包含库。
  3. 有特定于主题任务的数学解决方案。它解决了大数字问题。你可以把公式写成((10^n) - 1) * (10^n) - (10^m - 1) *(10^m)/2(这里是m= n-1),然后用分子乘法。重组他们。提取公共倍数10^(n-1)。然后你可以看到,这个答案有一个结构:X9...9Y0...0表示的是n,字母X和Y是常量。因此,您可以直接打印答案“字符串”而无需计算。
票数 0
EN

Stack Overflow用户

发布于 2020-09-25 17:33:06

我觉得你把浮点数拉得超出了它们的精度。让我解释一下:

函数C pow()将双倍作为参数。如果要传递ints,编译器将添加代码,在它们到达pow()之前将它们转换为双倍。(不管怎么说,当您以这种方式声明返回值时,您将其存储为一个双值)。

浮点之所以被称为浮点,正是因为浮点的“浮动”。在双面内有一个符号位,尾数有几个位,指数有几个位。在二进制中,提升到2的幂等于将分数点移到右边(或者如果你把分数点提升到负数的话)。基本上,指数是指分数点在哪里,以二进制表示。使用这种内存中的双倍表示的最大优点是,对于接近于0的数字,可以获得很多精度,并且随着数字的增大而逐渐失去精度。

最后一件事就是发生在你身上的事。您的号码太大了,无法准确存储。所以它被四舍五入到2的最接近的幂之和(2的幂是用二进制表示的所有零的数)。

快速实验:在浏览器中按F12,打开javascript控制台并键入49499999995499995136。在我的例子中,在铬的情况下,我重复同样的问题。

如果你真的想要精度这么大的数字,那么你可以尝试其中一些图书馆,但这是太先进的学生程序,你不需要它。如果用户输入的数字太大,只需添加一个if块并打印一条错误消息(教授喜欢这样做,这实际上是非常正确的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64065763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档