为什么 Splint(C 代码检查器)在比较 float 和 int 时会给出错误?

StackOverflow https://stackoverflow.com/questions/38027

  •  09-06-2019
  •  | 
  •  

两者都是数学值,但浮点数确实具有更高的精度。这是错误的唯一原因吗——精度的差异?或者还有另一个潜在的(而且更严重的)问题吗?

有帮助吗?

解决方案

这是因为整数值集不等于“int”和“float”类型的浮点值集。例如,浮点值 0.5 在整数集中没有相等的值,并且整数值 4519245367 可能不存在于浮点可以存储的值集中。因此,检查器将其标记为要由程序员检查的问题。

其他提示

因为这可能不是一个好主意。并非所有浮点数都可以截断为整数;并非所有整数都可以转换为浮点数。

进行比较时,整数值将“提升”为浮点值。此时,您正在两个浮点数之间进行精确的相等比较,这几乎总是一件坏事。

您通常应该有某种“epsilon ball”或可接受值的范围,并且如果两个值彼此足够接近以被视为相等,则可以进行比较。您需要一个大致如下的函数:

int double_equals(double a, double b, double epsilon)
{
   return ( a > ( b - epsilon ) && a < ( b + epsilon ) );
}

如果您的应用程序没有明显的 epsilon 选择,则使用 DBL_EPSILON。

因为 float 不能存储精确的 int 值,所以如果您有两个变量 int i 和 float f,即使您分配“i = f;”,比较“if (i == f)”也可能不会返回真。

假设有符号整数和 IEEE 浮点格式,可以表示的整数的大小为:

short  -> 15 bits
float  -> 23 bits
long   -> 31 bits
double -> 52 bits

因此一个 float 可以代表任何 short 和一个 double 可以代表任何 long.

如果您需要解决这个问题(您有正当理由并且很高兴其他答案中提到的问题对您来说都不是问题),那么只需从一种类型转换为另一种类型即可。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top