我可以比较一个浮点数并将其添加到C中的整数吗?

我可以将浮点数与整数进行比较吗?

浮点数会与代码中的整数相比吗?

float f; // f has a saved predetermined floating-point value to it if (f >=100){__asm__reset...etc} 

我还能……

 float f; int x = 100; x+=f; 

我必须使用从姿态参考系统接收的浮点值f来调整控制PWM信号以校正姿态的位置值x

第一个会很好。 100将转换为浮点数,IEE754可以将所有整数表示为浮点数,最多约为2 23

第二个也可以工作但是会先转换成整数,所以你会失去精度(如果你将浮点数转换为整数,这是不可避免的)。

既然你已经发现自己不熟悉浮点数的微妙之处,那么我将引用大卫戈德伯格的这篇优秀论文: 每个计算机科学家应该知道的浮点运算 (在Sun 再版 )。

在您被吓到之后,现实情况是, 大部分时间浮点对于完成计算是一个巨大的好处。 而现代编译器和语言(包括C)可以合理地处理转换,因此您不必担心它们。 除非你这样做。

提出的关于精度的要点肯定是有效的。 IEEE浮点有效地只有24位精度,小于32位整数。 使用double进行中间计算会将所有舍入和精度损失推回到转换回floatint

混合模式算术(不同类型和/或大小的操作数之间的算术)是合法但易碎的。 C标准定义了类型提升的规则,以便将操作数转换为公共表示。 自动类型提升允许编译器对混合模式操作做一些合理的事情,但“明智”并不一定意味着“正确”。

要真正了解行为是否正确,您必须首先了解促销规则,然后了解数据类型的表示。 一般来说:

  • 较短的类型转换为更长的类型( float doubleshortint等)
  • 整数类型转换为浮点类型
  • 有符号/无符号转换有利于避免数据丢失(有符号转换为无符号,反之亦然取决于相应类型的大小)

x > y (其中xy具有不同类型)的代码是正确还是错误取决于xy可以采用的值。 根据我的经验,通常的做法是禁止(通过编码标准)隐式类型转换。 程序员必须考虑上下文并明确执行必要的任何类型转换。

你能比较浮点数和整数吗? 但是你遇到的问题是精确性。 在大多数C / C ++实现中,float和int具有相同的大小(4个字节)和完全不同的精度级别。 两种类型都不能保存另一种类型的所有值。 由于一种类型不能在不损失精度的情况下转换为另一种类型,并且类型不能进行本机比较,因此在不考虑其他类型的情况下进行比较将导致某些情况下的精度损失。

为避免精度损失,您可以做的是将两种类型转换为具有足够精度来表示float和int的所有值的类型。 在大多数系统上,double会做到这一点。 因此,以下通常进行无损比较

 float f = getSomeFloat(); int i = getSomeInt(); if ( (double)i == (double)f ) { ... } 

LHS定义精度,因此如果您的LHS是int并且RHS是浮点数,那么这会导致精度损失。

另请参阅 FP相关的CFAQ

是的,你可以比较它们,你可以对它们进行数学计算,而不是在多数情况下非常考虑哪一个。 但只有最多。 最大的问题是你可以检查f等但不应该检查f==i 。 “应该”值相同的整数和浮点数不一定相同。

是的,它会正常工作。 具体来说,为了转换的目的,int将被转换为float。 在第二个中你需要转换为int但是否则应该没问题。

是的,有时它会完全符合您的期望。

正如其他人所指出的那样,比较例如1.0 == 1将会有效,因为整数1在比较之前被强制转换为double (不float )。

但是,其他比较可能不会。

关于这一点,符号1.0是double类型,所以比较是按照之前说的类型推广规则进行的。 1.f或1.0f是float类型,比较是在float中进行的。 它会起作用,因为我们说2 ^ 23个第一个整数在浮点数中是可表示的。