当人们可能“翻身”时,找不到两个花车之间的差异

时间:2012-06-07 20:45:42

标签: c# floating-point

背景:

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

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

我唯一的问题是,如果当我取初读数时该值接近最大值,然后在我进行第二次读数之前翻转到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.有谁知道我怎么可能解决这个问题?

1 个答案:

答案 0 :(得分:2)

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

如果你添加两个应该添加到大于float.MaxValue的数字的浮点数,结果将是float.PositiveInfinity,不是像有符号整数那样大的负数,或者是无符号整数的小正数

但在此之前,您很可能会遇到另一个问题:如果您向较大的数字添加一个小数字,结果可能是大数字,不变。因此,如果分数总是增加一些(相对)较小的数字,您很可能会发现,在某一点之后,分数不再变化。

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