Poo*_*rna 3 c c++ floating-point
我正在尝试优化以下操作,其中我有大量无符号短输入,需要按某个因子按比例缩小.有没有办法优化它不使用浮点运算
unsigned short val = 65523U;
val = val * 0.943;
Run Code Online (Sandbox Code Playgroud)
注意
我将在DSP上运行,浮点运算成本高昂
最简单的方法是使用可以保存结果的32位类型:
uint16_t val = 65523U;
val = (uint_fast32_t)val * 943 / 1000;
Run Code Online (Sandbox Code Playgroud)
或者,如果您想要更多类型的正确性和可移植性,同时允许编译器为任务使用最佳的整数类型:
#include <stdint.h>
uint_fast16_t val = UINT16_C(65523);
val = (uint_fast16_t) ( (uint_fast32_t)val * (uint_fast32_t)943 / (uint_fast32_t)1000 );
Run Code Online (Sandbox Code Playgroud)
您可以乘以整数近似值0.943*2 ^ 16,然后除以2 ^ 16,编译器应将其转换为右移.假设16位短路和至少32位整数:
val = ((unsigned)val * 61800) / 65536;
Run Code Online (Sandbox Code Playgroud)
根据您的具体要求,您可以通过四舍五入到最接近的整数来获得更准确的结果:
val = ((unsigned)val * 61800 + 32768) / 65536;
Run Code Online (Sandbox Code Playgroud)
任何其他两种力量都可以.在64位平台上,您可以使用2 ^ 48来获得更高的精度.
归档时间: |
|
查看次数: |
892 次 |
最近记录: |