我有两个size_t
整数,需要拿出他们的产品。我应该以什么类型存储结果?
#include <limits>
#include <vector>
#include <iostream>
int main() {
typedef std::size_t size_t;
typedef unsigned long long product_t;
std::vector<double> a(100000);
std::vector<double> b(100000);
size_t na {a.size()};
size_t nb {b.size()};
product_t prod = na * nb;
std::cout << prod << std::endl;
}
看起来gcc将size_t
定义为unsigned long long
所以我无法保证我能够存储产品......任何替代方案?
修改
这里的要点是我正在开发一个需要处理任意大小的向量的库,在其上计算一些统计量
double stat = computeStatisticOnVectors(a, b);
然后计算以下内容:
double result = stat / prod
答案 0 :(得分:2)
您是否考虑过不限制自己的原始类型?如果对您的应用程序重要的是处理如此大的size_type值,为什么不创建一个包含原始值的自定义类型?
答案 1 :(得分:2)
这实际上取决于您尝试使用代码实现的目标。
如果您稍后将该值用作size_t
(换句话说,为了调整向量,分配内存或其他一些内容),那么您可能应该进行一些不溢出的检查,但将值存储为size_t
。如果目的是根据大小创建新对象,则无论如何都无法使用更大的类型。
如果您正在执行“计算这些X向量中可能组合的数量”之类的操作,那么使用浮点类型可能会“足够好”。
答案 2 :(得分:1)
直到128位,并且假设您不需要太多可移植性,您可以使用内置类型,例如uint128_t
(至少在x86_64平台上受gcc和clang支持)。
如果您希望获得更多的可移植性,那么128位整数不是标准的,因此您需要:
当然,如果你可以简单地消除这个要求,那就更容易了;你计算的这个产品本身似乎并不多,所以只做stat / na / nb
就足够了。
答案 3 :(得分:0)
在你的例子中,你将乘以100000和100000(而不是非常大的大小值),显然你可能希望得到10 ^ 10的结果。
作为基于2 ^ 10~ = 10 ^ 3的粗略计算,将10的指数除以3并乘以10得到位数。现在10 * 10/3大约是33,这意味着你需要超过32位,这意味着64位。因此,请使用64位类型。
除了64位之外,应该对类型进行签名,因为对数字使用带符号的类型是个好主意(否则,由于隐式转换,您可能会无意中使用模块化算法,很难追踪错误)。所以,你正在寻找的内置类型是 - 带符号的64位整数 - 哦,那是long long
。
或者您可以使用<stdint.h>
中的一种类型别名。
那就是说,为什么在地球上你会增加大尺寸,为什么你需要将结果作为一个整数呢?
答案 4 :(得分:0)
您的统计数据将在向量上计算,其大小不会超过size_t容量。 我认为在你的情况下检测溢出就足够了。 我可以想到每种尺寸的双重转换,然后比较两种产品(size_t基础产品与双重产品)