c++ - 变量太大导致错误答案
问题描述
我一直试图找到一种方法来存储这个算术的结果几个小时。
我了解数据太大而无法存储。但是我的编译器似乎支持的最大数据类型是 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;
}
解决方案
假设:整数是 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 位有符号范围。
简短回答:您将需要一个大数字数学库来评估此范围内的数字。
推荐阅读
- python - 硒 Python 错误
- r - R交互式桑基图+分层节点
- android - 如何初始化 React Native 项目
- bash - compare - is line greater or less than previous in bash
- azure-active-directory - Azure AD B2C 链接到注册页面(未登录)
- c++ - 告诉 QMake -std=C++17。QMAKE_CXXFLAGS 被覆盖
- r - 使用参数“重要性 = TRUE”时不能使用变量重要性图
- ios - 反应原生对讲无法加载您的对话
- c# - 当我只读取值时,为什么会从 ConcurrentDictionary 收到“集合已修改”错误?
- php - 在 PHP 上访问 Ajax Post 数据时遇到问题