有趣。它很容易成为浮点软件的故障。嵌入式系统通常包括浮点作为选项,以减少代码大小。
我不确定这是否是问题所在,因为您的第一个语句有效。
会发生什么:
result = 0.005 - 0.001;
result = -result;
result = 0.002 - 0.001;
result = 0.002 - 0.002;
result = 0.002 - 0.003;
result = 0.001 - 0.002;
result = 0.001 - 0.003;
result = 0.001 - 0.004;
这里的想法是收集有关可能导致它的有用信息,这是取证中常见的事情。这些计算的结果可能有助于确定实际问题。
根据您在 cmets 中的结果:
result = 0.005 - 0.001; // 0.004
result = -result; // 0.000
result = 0.002 - 0.001; // 0.001
result = 0.002 - 0.002; // 0.000
result = 0.002 - 0.003; // 0.000
result = 0.001 - 0.002; // 0.000
result = 0.001 - 0.003; // 0.000
result = 0.001 - 0.004; // 0.000
看起来你的浮点库有一个严重的缺点。还有两个问题:
- 您如何打印结果(向我们展示实际代码)?
- 您使用的是哪种微控制器和开发环境?
您的打印方式可能有问题,也可能是您的环境限制。
Ajit,我认为你真的需要给我们一些代码来帮助你。不一定是你的真实代码(你对发布真实代码的担忧被理解),只是一些说明问题的部分。
根据您的一些 cmets,即:
Adriaan,“result”的数据类型是float,即32位表示(单个)。我有CAN 作为系统接口,因此我将结果乘以 1000 以通过 CAN 总线发送它。如果它恰好是一个负数,比如 -0.003,那么我期待 CAN 消息中出现 FF FD。我没有调试器。
我不确定我是否完全理解,但我会试一试。
您有一个 32 位浮点数,例如 -0.003,然后将其乘以 1000,然后将其放入一个整数中(0xFFFD 是 -3 的 16 位二进制补码表示)。那么当你运行如下代码时会发生什么:
int main(void) {
float w = -0.003;
int x = (int)(w * 1000);
int y = -3;
int z = -32768;
// Show us you code here for printing x, y and z.
return 0;
}
我想让你测试一个整数的原因是它可能与浮点数完全无关。可能浮点值是完全正确的,但是您打印它的方式(CAN 方法)存在一些问题。
如果“CAN”是某种串行接口,则可能对允许通过它发送的字节有限制。我可以设想一个场景,其中高字节用作数据包标记,以便 FF 实际上可能过早地结束消息。这就是为什么我也希望你测试 -32768 (0x8000)。
很难相信STMicroelectronics 会产生如此脑残的运行时系统,以至于它无法处理负浮点数。在我看来,信息在其他地方被破坏的可能性更大(例如,“打印”过程,无论是什么)。