为什么将Splint(C代码检查器)在将float与int进行比较时给出错误?
时间:2020-03-05 18:46:01 来源:igfitidea点击:
两者都是数学值,但是float确实具有更高的精度。那是误差的唯一原因就是精度的差异吗?还是还有另一个潜在的(而且更为严重的)问题?
解决方案
回答
因为这可能不是一个好主意。并非所有的浮点数都可以截断为int;并非所有int都可以转换为浮点数。
回答
这是因为整数值的集合与'int'和'float'类型的浮点值的集合不同。例如,浮点值0.5在整数集中不相等,并且浮点可存储的值集中可能不存在整数值4519245367. 因此,检查器将此标记为程序员要检查的问题。
回答
因为浮点数不能存储确切的int值,所以即使我们有两个变量int i和float f,即使我们分配了" i = f;",比较" if(i == f)"也可能不会返回true。
回答
如果我们需要解决这个问题(我们有正当的理由并且很高兴其他答案中提到的问题都不是我们遇到的问题),则只需将其从一种类型转换为另一种类型。
回答
假设有符号整数和IEEE浮点格式,则可以表示的整数的大小为:
short -> 15 bits float -> 23 bits long -> 31 bits double -> 52 bits
因此," float"可以表示任何" short",而" double"可以表示任何" long"。
回答
比较时,整数值将"提升"为浮点值。那时,我们正在两个浮点数之间进行精确的相等比较,这几乎总是一件坏事。
通常,我们应该具有某种"ε球"或者可接受的值范围,并且如果两个变量彼此之间的距离足够近以至于被视为相等,则可以进行比较。我们需要一个大致如下的函数:
int double_equals(double a, double b, double epsilon) { return ( a > ( b - epsilon ) && a < ( b + epsilon ) ); }
如果应用程序没有明显的epsilon选择,请使用DBL_EPSILON。