簡體   English   中英

可以容納兩個size_t乘積的類型

[英]Type that can hold the product of two size_t

我有兩個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

您是否考慮過不將自己限制為原始類型? 如果處理這樣巨大的size_type值對您的應用程序很重要,為什么不創建一個包含兩個原始值的自定義類型呢?

這實際上取決於您要使用代碼實現的目標。

如果以后要使用該值作為size_t (換句話說,用於確定向量的大小,分配內存等),則可能應該做一些檢查,以確保它沒有溢出,但將值存儲為size_t 如果目的是基於大小創建新對象,則無論如何您將無法使用更大的類型。

如果您正在執行“從這些X向量計算可能的組合數量”之類的操作,則使用浮點類型可能會“足夠好”。

直到128位,並且假設您不需要太多可移植性,您可以只使用內置類型,例如uint128_t (x86_64平台至少受gcc和clang支持)。

如果您希望獲得比此更高的可移植性,那么128位整數不是標准的,因此您需要:

  1. 定義自己的一對帶有重載運算符的64位整數將起作用
  2. 使用現有的庫,例如GMP(雖然是LGPL,但通用得多)
  3. 摘自Marc Glisse: Boost.Multiprecision(無許可證問題)

當然,如果您可以簡單地消除此要求,它將更容易。 您正在計算的該產品本身並沒有多大意義,因此僅執行stat / na / nb可能就足夠了。

在您的示例中,您將乘以100000和100000(大小的值通常不是很大),顯然,您希望得到的結果恰好是10 ^ 10。

作為基於2 ^ 10〜= 10 ^ 3的粗略計算,將10的指數除以3並乘以10得到位數。 現在10 * 10/3大約是33,這意味着您需要32位以上,也就是64位。 因此,請使用64位類型。

除了使用64位之外,還應該對類型進行簽名,因為對數字使用帶符號的類型是個好主意(否則,由於隱式轉換,您可能會無意中使用模塊化算術,並且難以跟蹤錯誤)。 因此,您要查找的內置類型是-帶符號的64位整數-哦,那是long long

或者,您可以使用<stdint.h>中的類型別名之一。

就是說,為什么在地球上要乘以大尺寸,為什么需要將結果作為一個精確的整數?

您的統計信息將根據向量進行計算,向量的大小不得超過size_t的容量。 我認為足以檢測到您的情況下的溢出。 我可以想到每種尺寸的兩次轉換,然后比較兩種產品(基於size_t的產品與雙倍產品)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM