Ste*_*ven 2 c++ embedded math types bit-shift
我已经提炼出一个方程式:
speed = ( ( rear_wheel_speed_a + front_wheel_speed_a ) << 10 ) +
( ( rear_wheel_speed_b + front_wheel_speed_b ) << 2 );
Run Code Online (Sandbox Code Playgroud)
但出于某种原因,我得到了意想不到的结果,所以我一定做错了.这开始是这样的:
speed = ((((rear_wheel_speed_a * 256 + rear_wheel_speed_b) / 16) +
((front_wheel_speed_a * 256 + front_wheel_speed_b) / 16)) / 2) * 128;
Run Code Online (Sandbox Code Playgroud)
这是完全没有简化的版本.它们不是数学上的等价物吗?
所有值都是16位整数.示例数据集是:
rear_wheel_speed_a = 0x03;
rear_wheel_speed_b = 0x6F; //<-- I originally swapped
front_wheel_speed_a = 0x02; //<-- these two values. Sorry!
front_wheel_speed_b = 0xE2;
Run Code Online (Sandbox Code Playgroud)
归结为6468的答案.但在第一个等式中,我的应用程序表现得好像它至少小3%或更大.我这样说是因为这是一个嵌入式应用程序,我无法确认计算结果,只能测试它是否在"正常"的某个范围内.当我使用第二个等式时,它属于参数,但是我的"简化"(位移)方程式并不是这样,我认为我必须不正确地进行移位(或者我简化了错误,但我对它进行了三次检查).
非常感谢,谢谢.
ark*_*rke 12
问题是你得到溢出.虽然您转换的等式在数学上是正确的,但是您的某些临时值高于您存储它们的带符号的16位整数.
具体而言,有问题的部分是
( rear_wheel_speed_a + front_wheel_speed_a ) << 10
Run Code Online (Sandbox Code Playgroud)
使用样本输入,结果值为0x1C800 - 大于无符号的16位整数!
最初的等式似乎已经考虑到了这一点.降档时,有些值会略微失去精度,但这比整数溢出要好.所以我建议使用原始等式,但你可以用乘法替换乘法和除法,当然:
((((rear_wheel_speed_a << 8) + rear_wheel_speed_b) >> 4) + (((front_wheel_speed_a << 8) + front_wheel_speed_b) >> 4)) << 6;
Run Code Online (Sandbox Code Playgroud)
另一个注意事项:您的输入front_wheel_speed_b已经溢出,除非它应该是负数.
| 归档时间: |
|
| 查看次数: |
431 次 |
| 最近记录: |