我需要根据非常数因子将值从一个单位转换为另一个单位.输入值范围为0到1073676289,范围值范围为0到1155625.转换可以这样描述:
output = input * (range / 1073676289)
Run Code Online (Sandbox Code Playgroud)
我自己的初始定点实现感觉有点笨拙:
// Input values (examples)
unsigned int input = 536838144; // min 0, max 1073676289
unsigned int range = 1155625; // min 0, max 1155625
// Conversion
unsigned int tmp = (input >> 16) * ((range) >> 3u);
unsigned int output = (tmp / ((1073676289) >> 16u)) << 3u;
Run Code Online (Sandbox Code Playgroud)
我的代码可以改进为更简单或更准确吗?
这将为您提供没有浮点值的最佳精度,结果将四舍五入为最接近的整数值:
output = (input * (long long) range + 536838144) / 1073676289;
Run Code Online (Sandbox Code Playgroud)
问题是input * range会溢出32位整数.通过使用64位整数修复此问题.
uint64_least_t tmp;
tmp = input;
tmp = tmp * range;
tmp = tmp / 1073676289ul;
output = temp;
Run Code Online (Sandbox Code Playgroud)