【问题标题】:Can I compare and add a floating-point number to an integer in C?我可以比较浮点数并将其添加到 C 中的整数吗?
【发布时间】:2010-10-20 00:42:59
【问题描述】:

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

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

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。 p>

【问题讨论】:

    标签: c floating-point integer


    【解决方案1】:

    第一个可以正常工作。 100 会被转换为浮点数,IEE754 可以将所有整数完全表示为浮点数,最多可达 223 左右。

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

    【讨论】:

    • 谢谢,这意味着如果 f = 1.0162 它将是 int f == 1,所以我只需要缩放它,f*=1000;所以 int f == 1016 保持精度?
    • 您不能将所有整数都表示为浮点数。不是浮点数的 24 位尾数。如果它是双倍的,是的,但不是浮动的:)
    • @Johannes,你说得对,我记错了我最近回答的一个问题,已更新以修复。
    【解决方案2】:

    由于您认为自己不熟悉浮点数的微妙之处,因此我建议您参考 David Goldberg 的这篇精彩论文:What Every Computer Scientist Should Know About Floating-Point Arithmeticreprint 在 Sun)。

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

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

    【讨论】:

    • +1 为 WECSSKAFPA 链接,这使我免于上网。 :)
    • 我略读了一下论文,我可能会推迟到以后...哈哈
    • 数学有点重...但是您可以略过所有证明并获得重点。最重要的一点是它并不总是那么简单......
    • 我喜欢“除非你这样做”位:-)
    【解决方案3】:

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

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

    • 较短的类型转换为较长的类型(floatdoubleshortint 等)
    • 整数类型转换为浮点类型
    • 有符号/无符号转换有利于避免数据丢失(无论有符号转换为 unsigned 或反之亦然取决于各自类型的大小)

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 我认为你想要 ">="(匹配原始问题)而不是 "=="。测试浮点数的精确相等几乎总是一个坏主意。
      【解决方案5】:

      LHS 定义精度, 因此,如果您的 LHS 是 int 而 RHS 是 float,那么这会导致精度损失。

      也可以看看FP相关CFAQ

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            正如其他人指出的那样,比较,例如 1.0 == 1 将起作用,因为在比较之前整数 1 被类型转换为 double(而不是 float)。

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                猜你喜欢
                • 2011-04-19
                • 2017-05-30
                • 1970-01-01
                • 2015-01-20
                • 2011-10-23
                • 1970-01-01
                • 2022-01-14
                • 1970-01-01
                • 2016-05-24
                相关资源
                最近更新 更多