我想将num与scale参数相乘。其中num和scale是浮动变量。我打算使用左移的二元运算符<< 。 PFB是我想要修改的逻辑,用于优化目的。这是代码的一部分。修改后会给出一些性能。
我的硬件在乘法运算时非常昂贵。我的代码是通过高度*宽度时间的图像进行这种乘法。所以我想通过移位运算符来避免这种情况
typedef float float32_t;
float32_t scale = 64.0 ;
float32_t num = 1.5f ;
num = num *scale ;
我想修改如下:
//float32_t scale = 64.0 ; //Left shift for performance benefits
float32_t num = 1.5f ;
num = num << 6 ;
但我收到以下错误:
error: invalid operands of types 'float32_t {aka float}' and 'float32_t {aka float}' to binary 'operator<<' float32_t num = num << 6 ;
有一种方法可以修改函数本身的参数类型。但是我不想修改此更改的函数原型。 任何人都可以告诉我解决方案。
答案 0 :(得分:8)
在C中,<<
和>>
运算符的操作数必须是整数类型。
一些运算符(一元运算符
~
和二元运算符<<
,>>
,&
,^
和|
,统称为按位运算符)需要具有整数类型的操作数。[...]
请注意
float32_t num = num *scale ;
num
未初始化且其值未指定,可能导致未定义的行为。
答案 1 :(得分:5)
错误告诉您使用按位移位的决定是非感性的。
坚持使用乘法运算符。
答案 2 :(得分:3)
移动浮点值并没有任何意义。即使您强制编译器生成移动浮点值的位的代码,结果肯定也不等于乘法。浮点数中的位通常不像整数那样组织。
如果您的编译器可以进行任何优化以使乘法速度加倍,编译器将为您解决这个问题。
如果您的编译器非常糟糕且无法确定优化,那么您正在寻找的标准函数称为ldexp
。它将浮点值乘以2的幂。但是如果你的代码在FLT_RADIX
不是2(非常罕见)的机器上运行,那么ldexp
可能是个坏主意,所以除非你能做到这一点,否则不要这样做表明它是绝对必要的。
答案 3 :(得分:0)
浮点值的逐位移位是没有意义的。
如果要将浮点数乘以2 n ,以获得与将整数移位n
位相同的数值效果,那么有一个库函数用于此:
#include <cmath> // C++, <math.h> in C
float32_t scaled_num = std::ldexp(num, 6); // C++, ldexpf in C (assuming `float32_t` is `float`)