首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中双变量数据类型的算术移位

C++中双变量数据类型的算术移位
EN

Stack Overflow用户
提问于 2011-08-11 02:11:59
回答 6查看 9K关注 0票数 7

我正在尝试在C中对双精度数据类型进行算术位移位,我想知道这是不是正确的方法:

注意: firdelay在main中声明为双firdelay8

代码语言:javascript
复制
void function1(double firdelay[][12]) {
    int * shiftptr;

    // Cast address of element of 2D matrix (type double) to integer pointer
    *shiftptr = (int *) (&firdelay[0][5]); 

    // Dereference integer pointer and shift right by 12 bits
    *shiftptr >>= 12; 
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-11 02:24:05

按位移位浮点数据类型不会给出您想要的结果。

在Simulink中,移位算术块仅对整数数据类型进行位移位。如果输入浮点类型,它会将输入信号除以2^N,其中N是掩码对话框中指定的移位位数。

编辑:

由于您不能执行任何浮点数学运算,因此您的选择如下:

  • 了解浮点单精度数的layout,然后弄清楚如何按位操作它以实现除法。
  • 转换您要移植的任何算法以使用定点数据类型,而不是浮点

我推荐选项2,它比选项1简单得多

票数 6
EN

Stack Overflow用户

发布于 2011-08-11 02:17:44

对浮点数据类型进行位移位(重新解释为整型)会让你胡言乱语(看看二进制表示here的图表就知道原因了)。

如果你想乘以2的幂/除2的幂,那么你应该显式地这样做。

票数 4
EN

Stack Overflow用户

发布于 2011-08-11 02:30:20

根据措辞不佳且非常不明确的documentation,Simulink中的“位移位”似乎接受两个浮点值的参数,并具有将浮点值乘以两个参数的效果。

您可以使用ldexp(double_number, bits_to_pseudo_shift)来获得此行为。在<math.h>中可以找到函数ldexp

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7015663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档