可以容纳两个size_t的产品的类型

时间:2014-03-02 11:56:56

标签: c++ integer-overflow

我有两个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

5 个答案:

答案 0 :(得分:2)

您是否考虑过不限制自己的原始类型?如果对您的应用程序重要的是处理如此大的size_type值,为什么不创建一个包含原始值的自定义类型?

答案 1 :(得分:2)

这实际上取决于您尝试使用代码实现的目标。

如果您稍后将该值用作size_t(换句话说,为了调整向量,分配内存或其他一些内容),那么您可能应该进行一些不溢出的检查,但将值存储为size_t。如果目的是根据大小创建新对象,则无论如何都无法使用更大的类型。

如果您正在执行“计算这些X向量中可能组合的数量”之类的操作,那么使用浮点类型可能会“足够好”。

答案 2 :(得分:1)

直到128位,并且假设您不需要太多可移植性,您可以使用内置类型,例如uint128_t(至少在x86_64平台上受gcc和clang支持)。

如果您希望获得更多的可移植性,那么128位整数不是标准的,因此您需要:

  1. 定义您自己的,一对64位整数,重载运算符可以正常工作
  2. 使用现有的库,例如GMP(虽然LGPL,但更通用)
  3. 来自Marc Glisse: Boost.Multiprecision(没有许可证问题)
  4. 当然,如果你可以简单地消除这个要求,那就更容易了;你计算的这个产品本身似乎并不多,所以只做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基础产品与双重产品)

相关问题