首页 > 解决方案 > 变量太大导致错误答案

问题描述

我一直试图找到一种方法来存储这个算术的结果几个小时。

我了解数据太大而无法存储。但是我的编译器似乎支持的最大数据类型是 unsigned long long。

#include <iostream>
#include <iomanip>
#include <limits>
using namespace std;

int main() {
   int num1 = 100000;
   int num2 = 200000;
   int num3 = 300000;
   double num4 = 500000.00;
   unsigned long long product = (num1 * num2 * num3 * num4);

   cout << fixed << setprecision(3) << product << endl;

   // Answer should be 3000000000000000000000.000
   // Result is 18446447556077551616
   return 0;
}

标签: c++

解决方案


假设:整数是 32 位的。long long 是 64 位的。

64 位无符号的最大值可以是:

  18446744073709551615

您正在尝试计算:

3000000000000000000000

不适合任何 64 位整数(有符号或无符号)

让我们也分解问题:

num1, num2,num3是整数,以及将所有三个整数相乘的表达式

   num1 *   num2 *   num3
 100000 * 200000 * 300000

作为一个整数表达式num1*num2*num3已经溢出了您要与之相乘的值。那是在我们乘以之前num4

更好的解决方案是声明 num1、num2 和 num3,long long以便将上述表达式计算为相同的类型。

但即使使用此修复程序,6 万亿乘以 500000.0 的乘法也会被评估为双倍。这仍然会溢出双精度和 64 位有符号范围。

简短回答:您将需要一个大数字数学库来评估此范围内的数字。


推荐阅读