0

背景:

我有一个 opc 标签,其值为 32 位浮点数。标签代表一个正在运行的计数 - 所以在某些时候总数将达到最大值并从 0 重新开始。关于标签的另一个信息是它的数据类型是单浮点数,但它的值总是一个整数(我没有创建标签,所以我不确定为什么选择浮动)。

在我的应用程序中,当某个事件被触发时,我记录了这个运行总计的当前值,当另一个事件被触发时,我获取总计的当前值,然后需要计算差值。

我唯一的问题是,如果在我进行初始读数时该值接近最大值,然后在我进行第二次读数之前翻转到 0+,我最终会得到一个负值的差值。

到目前为止我已经有了这个(它在 c# 中):

    float diff (float a, float b) {
        if (b < a) {
            float f = float.MaxValue - a;
            return f + b;
        }
        return b - a;
    }

但这不起作用,因为除非 a 很大,float.MaxValue - a == 0。有谁知道我如何解决这个问题?

4

1 回答 1

2

浮点数不会像整数那样溢出。

如果将两个浮点数相加到大于 的数字上float.MaxValue,则结果将是float.PositiveInfinity,而不是像有符号整数那样的大负数或像无符号整数那样的小正数。

但在此之前,您很可能会遇到一个不同的问题:如果将一个小数添加到一个大数中,结果可能是大数,不变。所以,如果分数总是增加一些(相对)小的数字,你很可能会发现,在某个点之后,分数不再改变。

由于这一切,你的“翻车”永远不会发生,所以也许你不必做任何事情。但更好的解决方案是使用整数类型来表示整数,从而避免所有这些陷阱。

于 2012-06-08T10:25:08.930 回答