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

时间:2009-04-17 04:23:29

标签: c floating-point integer

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

float会与代码中的整数进行比较吗?

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 以校正姿态。

9 个答案:

答案 0 :(得分:21)

第一个将正常工作。 100将转换为浮点数,IEE754可以将所有整数表示为浮点数,最多约2 23

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

答案 1 :(得分:10)

由于你已经发现自己不熟悉浮点数的微妙之处,我将向大家戈德伯格推荐这篇高级论文:What Every Computer Scientist Should Know About Floating-Point Arithmetic(在Sun的reprint)。

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

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

答案 2 :(得分:8)

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

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

  • 较短的类型会转换为较长的类型(floatdoubleshortint等等。)
  • 整数类型转换为浮点类型
  • 签名/​​未签名转换有利于避免数据丢失(无论是否已将签名转换为 无符号或反之亦然取决于相应类型的大小)

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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

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

另请参阅与FP相关的CFAQ

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

然而,其他比较可能不会。

答案 8 :(得分:0)

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