方程式を次のように要約しました。
speed = ( ( rear_wheel_speed_a + front_wheel_speed_a ) << 10 ) +
( ( rear_wheel_speed_b + front_wheel_speed_b ) << 2 );
しかし、何らかの理由で予期しない結果が得られているため、何か間違ったことをしているに違いありません。これは次のように始まりました。
speed = ((((rear_wheel_speed_a * 256 + rear_wheel_speed_b) / 16) +
((front_wheel_speed_a * 256 + front_wheel_speed_b) / 16)) / 2) * 128;
それは機能する完全に単純化されていないバージョンです。それらは数学的に同等ではありませんか?
すべての値は符号付き 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;
それは 6468 の答えに要約されます。しかし、最初の式では、アプリケーションは少なくとも 3% 小さいか大きいかのように動作します。これは組み込みアプリケーションであり、「通常」の特定の範囲内にあるかどうかをテストする以外に、計算の結果を確認する方法がないためです。2番目の方程式を使用すると、パラメータ内に収まりますが、「簡略化された」(ビットシフトされた) 方程式ではそうではありません。
どんな洞察でも感謝します、ありがとう。