我有一个我正在尝试执行的转换:
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
尽可能多的情况并仍然产生正确的结果?