[英]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位整數不是標准的,因此您需要:
當然,如果您可以簡單地消除此要求,它將更容易。 您正在計算的該產品本身並沒有多大意義,因此僅執行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.