【问题标题】:error: invalid operands to binary % when taking modulus of float [duplicate]错误:取浮点模数时二进制 % 的操作数无效 [重复]
【发布时间】:2013-10-11 11:41:10
【问题描述】:

这是一个相当长的一周,如果我很厚,请原谅我。

我有一些类似的代码:

float someFloat = 0;
//....do some stuff to someFloat
//....

if( someFloat % 1)
{
   //take some action
}

我得到一个编译器错误:error: invalid operands to binary %

假设编译器不吸毒,这有什么问题?

编辑:顺便说一句,我真正想做的是检测非整数值并四舍五入。 我应该做的是调用roundf(我想检查返回值是否小于操作数,如果是则递增,以确保我们已经四舍五入)

【问题讨论】:

  • 答案已经存在。对于诸如为什么不使用float之类的更多问题?请查看why-does-modulus-division-only-work-with-integers?
  • 如果有 any 个非零小数部分,请使用ceilf,而不是roundf。注意:ceilf 向无穷大舍入;如果您希望负数向 -infinity 四舍五入(例如,-3.25 到 -4),则需要额外的代码。
  • @EricPostpischil 这几乎正是我想要的。不过我没有把它放在我的目标上,所以我想它是我的双重版本ceil...
  • 查看% 下的C 手册。它将说明有效的操作数是什么。查看float 是否被列为有效操作数。 (剧透警告:不是。)

标签: c


【解决方案1】:

% 是整数运算符 - 使用 fmodfmodf 表示双精度数或浮点数。

或者,如果您希望浮点数表示整数值,则首先将其转换为 int,例如:

if ((int)someFloat % 2 == 1) // if f is an odd integer value
{
    ...
}

【讨论】:

  • 嗯,我从来不知道。只做了 15 年.... 只是看看我值得信赖的旧 K&R,就是这样。
  • 我 30 年了,还在学习…… ;-)
  • @PaulR 与几乎任何其他科学一样,我们永远无法完全学习一门语言。 :)
  • 是的 - 当然,30 年后你开始怀疑有些东西你曾经知道,然后忘记了,然后不得不重新学习...... ;-)
  • @Paul R 感谢 fmod 提示
【解决方案2】:

模数运算符仅适用于整数。对于浮点值,请使用 fmodfmodf

【讨论】:

  • @downvoter(我们都知道你是谁):嘿!那真是成熟了。
【解决方案3】:

% 这仅适用于整数 将 fmod 用于浮点或双精度值**

double fmod(double x, double y)


x -- This is the floating point value with the division numerator i.e. x.

y -- This is the floating point value with the division denominator i.e. y.

【讨论】:

    猜你喜欢
    • 2012-12-22
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多