在两个不动点表达之间转换
Converting between two fixed point representations
我正在尝试将一个数字从一个不动点表示转换为另一个。我使用2的补码表示(Qmf表示)这是为了验证硬件实现。硬件实现工作如下:
输入数据采用Qmf格式。输入数据为8比特宽,并且具有6比特的小数长度。我想把它转换成4位小数(没有整数位),我对此有一些疑问。
我注意到,当我试图将像1.984375这样的数字从Q26{range[-2,1.984375]}格式转换为Q04{range[-0.5,0.4375]}形式时,硬件实现如下所示:我读取位5-2,因为位6&7用于整数部分,并将其存储在4位寄存器中。因此,当转换为Q04格式时,该值被解释为-0.5。-0.5正确吗?产生的错误数量似乎很大。我做错什么了吗?如果上述方法是正确的。有没有任何标准的程序可以在软件中从一个定点表示转换为另一个,模仿我上面描述的硬件方法。我正在考虑将数字从Q26表示转换为浮点,然后将其转换回不动点。在软件中有更干净的方法吗?
我认为您可以通过简单的位屏蔽操作和一点逻辑来完成转换。
如果您的Q26数字为正(即第7位为零),则相应的Q04数字将仅为原始数字的第2位至第5位,前提是第6位为零。这意味着您的原始编号必须小于1。
如果您的Q26数字为负(即,位-7为1),则相应的Q04数字再次为位-2至位-5或您的原始数字,但这次假设位-6为1,并且位2-5中至少有一个非零位。这意味着您的原始数字必须大于-1。
在每种情况下,忽略位0&1,你可能想通过在你的Q04数字的最低有效位上加一或减一来解释。这显然需要额外的算术运算,并且有可能超出Q04数字的允许范围。
如果您想在Python中对此进行实验,可以尝试spfpm之类的库。
- 在 Rcpp 中的字符串类型之间转换时出错
- r-在Rcpp和C++之间转换矢量(使用Rcpp::as或Rcpp:::wrap)是否会创建一个新的矢量并复制元素
- 在不同类型之间转换常量指针
- 在 3D 骨架系统 DirectX 之间转换
- C++ 如何将用户控件添加到窗体,以便我可以在面板之间转换
- 在 std::u8string 和 std::string 之间转换
- 如何在Unicode/UCS CodePoint和UTF16替代对之间转换
- 在DXGI格式之间转换RGBA数据
- 在两个不动点表达之间转换
- 在函数指针类型之间转换
- 代码的错误答案是在Java Camel案件和C 下划线标识符之间转换的错误答案
- 如何在C 中的不同类之间转换
- 一个关于C++中double和int之间转换的奇怪结果
- 模板类在模板类型之间转换,但也专门化
- 是否有Visual c++编译器在线,以及如何在c++和vs简单代码之间转换
- c/在Unix时间和"Gregorian time"之间转换
- 无法使用iconv在编码之间转换
- 在std::string和std::wstring之间转换的多平台方式
- 我真的应该每次在基元类型之间转换时都使用static_cast吗
- 使用Boost::units在两个量之间转换的最简单方法