gpt4 book ai didi

c - C 中的浮点减法结果为零

转载 作者:太空狗 更新时间:2023-10-29 15:31:03 26 4
gpt4 key购买 nike

我有用 C 语言编写的代码,适用于 16 位微 Controller 。该代码基本上执行大量浮点运算。

在结果为正之前,算术工作正常,但在减法的情况下,如果预期结果为负,我得到零。

result = 0.005 - 0.001;      Is correctly computed as 0.004
result = 0.001 - 0.005; Is always zero.

为什么 float 会有这样的行为?

最佳答案

很有趣。这很容易是浮点软件中的错误。嵌入式系统通常包括 float 选项,以减少代码大小。

我不确定这是否是这里的问题,因为您的第一个陈述有效。

发生了什么:

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;

这里的想法是收集有关可能导致它的有用信息,这在取证中很常见。这些计算的结果可能有助于确定实际问题。

根据您在评论中的结果:

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

看起来你的浮点库有一个严重的缺点。还有两个问题:

  • 您如何打印结果(向我们展示实际代码)?
  • 您使用的是哪种微 Controller 和开发环境?

您的打印方式可能存在一些问题,或者可能是您的环境限制。

Ajit,我认为您真的需要给我们一些代码来帮助您解决问题。不一定是您的真实代码(您对发布真实代码的担忧是可以理解的),只是一些能够说明问题的代码。

根据您的一些评论,即:

Adriaan, the datatype for "result" is of float, that is, 32-bit representation (single). I have CAN as the system interface, and hence I am multiplying the result by 1000 to send it over the CAN bus. If it happens to be a negative number, like -0.003, then I am expecting FF FD in the CAN message. I do not have a debugger.

我不确定我是否完全理解,但我会试一试。

你有一个 32 位 float ,例如 -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;
}

我要你测试一个整数的原因是它可能与 float 没有关系。浮点值可能是完全正确的,但是您打印它的方式(CAN 方法)存在一些问题。

如果“CAN”是某种串行接口(interface),可能是对允许通过它发送的字节数有限制。我可以设想这样一种场景,其中高字节用作数据包标记,这样 FF 实际上可能会过早地结束消息。这就是为什么我还希望您测试 -32768 (0x8000)。

很难相信STMicroelectronics会产生这样一个脑死亡的运行时系统,它无法处理负 float 。在我看来,信息更有可能在其他地方被破坏(例如,“打印”过程,无论是什么)。

关于c - C 中的浮点减法结果为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1392391/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com