実行しようとしている変換があります。
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
、正しい結果を生成できるように実装する最も効率的な方法は何ですか?