背景:
我有一个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.有谁知道我怎么可能解决这个问题?
答案 0 :(得分:2)
浮点数不会像整数那样溢出。
如果你添加两个应该添加到大于float.MaxValue
的数字的浮点数,结果将是float.PositiveInfinity
,不是像有符号整数那样大的负数,或者是无符号整数的小正数
但在此之前,您很可能会遇到另一个问题:如果您向较大的数字添加一个小数字,结果可能是大数字,不变。因此,如果分数总是增加一些(相对)较小的数字,您很可能会发现,在某一点之后,分数不再变化。
由于这一切,你的“翻身”永远不会发生,所以也许你不必做任何事情。但更好的解决方案是使用整数类型来表示整数,从而避免所有这些陷阱。