我有一個轉換,我試圖執行:64位的溢的數學轉換
uint64_t factor = 2345345345; // Actually calculated at runtime, but roughly this magnitude
uint64_t Convert(uint64_t num)
{
return num * 1000ULL/factor;
}
對於最大num
值由factor
將之前乘法包裝。將訂單更改爲num/factor * 1000UL
失去了一些不可接受的準確性。
我想重寫Convert()
來處理所有可能num
值:
uint64_t Convert(uint64_t num)
{
if(num > MAX_UINT64/1000ULL) // pseudo code
{
// Not sure what to put here
}
else
{
return num * 1000ULL/factor;
}
}
我們考慮使用128位數學,但想如果可能的話,以避免它。
執行Convert()
的最有效方法是什麼?這樣才能理想地處理最大的num
,並且仍能產生正確的結果?
你的意思是ULL?或者,您是否因特定原因使用32位因子? – kfsone
@kfsone爲了清晰起見,我將其更改爲ULL。 – JaredC
@kfsone - 1000是一個'int',它可以是或不是32位。無論如何,它會在使用它的各個地方轉換爲'uint64_t'。 –