我可以在C中比较并将浮点数与整数相加吗?

我可以在C中比较并将浮点数与整数相加吗?,c,floating-point,integer,C,Floating Point,Integer,我可以将浮点数与整数进行比较吗 浮点数会与代码中的整数进行比较吗 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来调整位置值x,该位置值控制PWM信号以校正姿态。是的,它可以正常工作。具体来说,出于转换的目的,int

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

浮点数会与代码中的整数进行比较吗

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来调整位置值x,该位置值控制PWM信号以校正姿态。

是的,它可以正常工作。具体来说,出于转换的目的,int将被转换为float。在第二个选项中,您需要将其转换为int,否则应该可以。

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

第二个也可以,但首先会转换为整数,因此会丢失精度(如果将浮点转换为整数,这是不可避免的)。

LHS定义精度, 因此,如果您的LHS为int,RHS为float,则会导致精度损失


还可以看看与FP相关的

是的,有时它会完全满足您的期望

正如其他人所指出的,比较(例如,1.0==1)是可行的,因为整数1在比较之前被类型转换为
double
(而不是
float


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

是的,你可以比较它们,在大多数情况下,你可以对它们进行数学运算,而不用太在意哪个是哪个。但只有大多数。最大的问题是你可以检查
f你能比较浮点和整数吗,当然。但你会遇到的问题是精确性。在大多数C/C++实现中,float和int具有相同的大小(4字节)和不同的精度级别。两种类型都不能保存其他类型的所有值。由于无法将一种类型转换为另一种类型而不损失精度,并且无法对这些类型进行本机比较,因此在某些情况下,在不考虑其他类型的情况下进行比较将导致精度损失

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

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

既然你认为自己不熟悉浮点数的微妙之处,那么我就请你参考大卫·戈德伯格(David Goldberg)(在Sun)的这篇优秀论文

在你被它吓坏之后,事实是大多数时候浮点运算对完成计算是一个巨大的好处。现代编译器和语言(包括C语言)明智地处理转换,因此您不必担心它们。除非你这么做

关于精确性的观点当然是正确的。一个有效的整数只有24位精度,比32位整数小。使用
double
进行中间计算会将所有舍入和精度损失推到转换回
float
int

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

要真正了解行为是否正确,必须首先了解提升规则,然后了解数据类型的表示形式。非常笼统地说:

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

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

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

谢谢,这意味着如果f=1.0162,它将是int f==1,所以我只需要缩放它,f*=1000;所以int f==1016以保持精度?不能将所有整数完全表示为浮点。不是用float的24位尾数。如果是双精度,是的,但不是浮动:)@Johannes,你是对的,我不记得我最近回答的一个问题,已更新为修复。+1用于WECSSKAFPA链接,这使我避免了在上面冲浪。:)我略读了一下论文,我可能会推迟到以后。。。hahaIt的数学有点重。。。但是你可以略过所有的证据,得到重点。重要的一点是,它并不总是简单的……我喜欢“除非你这样做”这一点:-)我想你想要“>=”(匹配原始问题),而不是“==”。测试浮点数的精确相等性几乎总是一个坏主意。