【问题标题】:real modulo operator in C/C++? [duplicate]C/C++ 中的实数模运算符? [复制]
【发布时间】:2012-08-18 20:15:29
【问题描述】:

可能重复:
How to code a modulo (%) operator in C/C++/Obj-C that handles negative numbers

据我了解(参见 Modulo operator with negative valuesModulo operation)C 和 C++ 有一个“余数”运算符 a % b,但当 LHS 为负数时,没有真正执行模运算的运算符。

几种语言确实有这样的功能。是否可以在 C/C++ 中构建一个高效的函数(或者在 i686/x64 CPU 上没有高效的方法)?

目前我使用(n * b + a) % b,其中n 被选中,这样我相当确定整个LHS 是非负数,但不可避免地会更改代码并且有时会出现错误。

注意:如果不清楚,我所说的模算术是指一个运算符,使得a + b % b = a % b 用于所有整数a 和所有正整数b

【问题讨论】:

  • 您在使用整数吗?否则我会推荐std::fmod
  • 整数,是的。主要作为数组索引。
  • 我真的迟到了(晚了 7 年),但这是不是:(a % b + b) % b 也许你在找什么?

标签: c++ c modulo


【解决方案1】:

没有简单的方法可以做到这一点,但是如果您创建一个两行解决方案,并节省乘法和确定n,则效率更高。

inline int modulo(int a, int b) {
  const int result = a % b;
  return result >= 0 ? result : result + b;
}

另外,如果您还需要正确处理负数 b 数字,请添加到开头:

          if(b < 0) return modulo(-a, -b);

【讨论】:

  • “没有简单的方法”......真的吗?你的解决方案对我来说看起来很简单。 +1
  • 哇,真快!我稍后会测试性能,但除非跳跃很大,否则它可能不会比我使用的 ATM 慢很多。
【解决方案2】:

我会建议使用类似于上面的函数,但使用inline int modulo(int a, int b) {}(就像该运算符存在于 C++ 中一样)。就我个人而言,我不经常使用负数,并且仍然认为只要您的代码不使用负数,您就应该保留%

【讨论】:

  • 我在答案中添加了内联建议。谢谢。
  • 问题是代码被改变了,曾经的非负数有时最终变成了负数。不过,我可能会在某些地方使用 % 和断言(我不太关心调试模式的性能)。
  • @dhardy 代码被更改是什么意思?我所说的情况是例如数组索引(从不
  • 我的意思是新功能意味着旧的东西被改变了,并不总是以某种方式让改变的每一个细节都得到应有的关注。看看this,如果你真的想知道,那就来帮忙寻找更多的错误。
猜你喜欢
  • 2012-10-17
  • 1970-01-01
  • 2021-02-23
  • 2016-05-18
  • 1970-01-01
  • 2020-11-16
  • 2011-06-09
  • 1970-01-01
  • 2021-04-08
相关资源
最近更新 更多