定点乘法

Van*_*den 2 c fixed-point

我需要根据非常数因子将值从一个单位转换为另一个单位.输入值范围为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)

我的代码可以改进为更简单或更准确吗?

use*_*166 6

这将为您提供没有浮点值的最佳精度,结果将四舍五入为最接近的整数值:

output = (input * (long long) range + 536838144) / 1073676289;
Run Code Online (Sandbox Code Playgroud)

  • @banuj:536838144是1073676289的一半; 并导致最终结果四舍五入到最接近的整数而不是截断.例如,`1073676288/1073676289 = 0`但是`(1073676288 + 536838144)/ 1073676289 = 1`. (2认同)

Bre*_*dan 5

问题是input * range会溢出32位整数.通过使用64位整数修复此问题.

uint64_least_t tmp;
tmp = input;
tmp = tmp * range;
tmp = tmp / 1073676289ul;
output = temp;
Run Code Online (Sandbox Code Playgroud)