左移<<浮点变量

时间:2015-03-23 12:25:55

标签: c

我想将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  ;

有一种方法可以修改函数本身的参数类型。但是我不想修改此更改的函数原型。 任何人都可以告诉我解决方案。

4 个答案:

答案 0 :(得分:8)

在C中,<<>>运算符的操作数必须是整数类型。

C11:6.5表达式(p4):

  

一些运算符(一元运算符~和二元运算符<<>>&^|,统称为按位运算符需要具有整数类型的操作数。[...]

请注意

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`)