2014-03-02 12 views
0

我有兩個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_tunsigned long long,所以我不能保證我將能夠存儲產品......任何的替代品?

編輯:

這裏的關鍵是,我正在開發一個需要處理任意大小的矢量庫,計算它

double stat = computeStatisticOnVectors(a, b); 

一些統計,然後計算如下:

double result = stat/prod 
+0

事情我已經在Windows頭看到的是一個叫[ULARGE_INTEGER(http://msdn.microsoft.com/en-us/library/windows/desktop/aa383713(V = vs.85)的.aspx結構),其目的是保存極其龐大的數字。這可能會幫助你。 – computerfreaker

+0

毫無意義,size_t表示可以分配的內存量。將兩個64位處理器相乘並不能爲您提供128位處理器。 –

+2

@HansPassant它也代表了一些數據點可以儲存,並在某些情況下是有意義的定義對這些數據點操作計數... – Calimo

回答

1

直到128位,並假設您不需要太多的便攜性,在類型如uint128_t(至少在x86_64平臺上由gcc和clang支持)。

如果您希望比這個更便攜,那麼128位整數不標準,所以你將需要:

  1. 定義你自己的,一對64位整數與超載運營商將工作
  2. 使用現有的庫,如GMP(LGPL雖然,但更通用)
  3. 從馬克Glisse: Boost.Multiprecision(不含許可發行)

當然,如果你可以簡單地消除這個要求,它會更容易;你正在計算的這個產品本身並沒有多大意義,所以只要做stat/na/nb就足夠了。

+0

「GNU許可證」:LGPL,請準確。如果你過敏,你可以提到Boost.Multiprecision,它提供了一個便攜的'int128_t'類型。 –

+0

@MarcGlisse:謝謝,編輯於。 –

2

您是否認爲自己不限制爲原始類型?如果對應用程序來說處理如此巨大的size_type值很重要,爲什麼不創建一個既包含原始值又包含原始值的自定義類型?

+0

我確實考慮如何避免服用這個產品(我猜一定是可能的),但希望有一種懶惰的方式來存儲結果的第一位。 – Calimo

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>的其中一種類型別名。

這就是說,爲什麼在地球上你乘以大尺寸,爲什麼你需要結果作爲一個確切的整數?

+0

我正在寫一個庫,用戶可以傳遞任何他們想要的大小的向量。 100000在這裏只是一個例子,但我可能接受()''大小的std :: numeric_limits 的兩個向量:: max和必須處理它。在我的系統上已經是兩個64位整數,所以我需要128位。但理想情況下,我希望這是可移植的,無論系統上有多大的size_t。 正如我在其他評論中所說,我也在考慮擺脫產品。 – Calimo

2

這實際上取決於你試圖用你的代碼實現什麼。

如果您稍後要使用該值作爲size_t(換句話說,用於調整矢量大小,分配內存等),那麼您可能應該進行一些檢查,以確定它沒有溢出,但存儲值爲size_t。無論如何,如果目的是根據尺寸創建新對象,您將無法使用更大的類型。

如果你正在做「像這些X向量計算可能組合的數量」這樣的事情,那麼使用浮點類型可能會「足夠好」。

+0

我編輯我的問題更多的細節,而不是'stat/prod'我可以做'stat/na/nb'。我會在這裏放鬆多少精度? – Calimo

+1

好吧,如果結果是從你的'stat'計算一個'double',那麼如果'prod'是雙督促=(雙)size_a * size_b的'結果;',你是不是喜歡在失去任何精度這個計算的整數版本,因爲唯一一次它有所作爲的是如果'prod'大於53位(而最低位不是零) - 那時,你可能不會注意到太多的輸出差異。我們正在談論9E + 15左右,所以「損失」將是結果的1E-16倍左右。 –

+1

同樣,在做兩個獨立的分裂會的工作,再次只要結果不超過2^53非零最低位],你不會失去任何精度。當然,無論你做什麼,結果都只能精確到53位,所以大約53 /(log(10)/ log(2))= 16位數。 –

0

您的統計信息將在矢量上計算,其大小不會超過size_t容量。 我認爲這足以在你的案例中檢測到溢出。 我可以想到每個尺寸的雙重轉換,然後比較兩個產品(基於size_t的產品vs雙重產品)

相關問題