首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >floor()/int()函数实现

floor()/int()函数实现
EN

Stack Overflow用户
提问于 2011-02-26 05:37:32
回答 7查看 16.3K关注 0票数 5

有人知道方法/函数Int()floor()是如何实现的吗?我正在寻找一个相应的实现,如下所示是abs()函数。

代码语言:javascript
复制
Int Abs (float x){
  if x > 0 
      return x;
   else
      return -x
}

我正在努力寻找一个不使用模运算符的解决方案。

EN

回答 7

Stack Overflow用户

发布于 2011-02-26 05:43:17

在我看来就像

代码语言:javascript
复制
floor(n) = n - (n % 1)

应该能行得通。

票数 23
EN

Stack Overflow用户

发布于 2011-02-26 08:40:32

使用IEEE 754 binary floating point representation一种可能的解决方案是:

代码语言:javascript
复制
float myFloor(float x)
{
  if (x == 0.0)
    return 0;

  union
  {
    float input;   // assumes sizeof(float) == sizeof(int)
    int   output;
  } data;

  data.input = x;

  // get the exponent 23~30 bit    
  int exp = data.output & (255 << 23);
  exp = exp >> 23;

  // get the mantissa 0~22 bit
  int man = data.output & ((1 << 23) - 1);

  int pow = exp - 127;
  int mulFactor = 1;

  int i = abs(pow);
  while (i--)
    mulFactor *= 2;

  unsigned long long denominator = 1 << 23;
  unsigned long long numerator = man + denominator;

  // most significant bit represents the sign of the number
  bool negative = (data.output >> 31) != 0;

  if (pow < 0)
    denominator *= mulFactor;
  else
    numerator *= mulFactor;

  float res = 0.0;
  while (numerator >= denominator) {
    res++;
    numerator -= denominator;
  }

  if (negative) {
    res = -res;
    if (numerator != 0)
      res -= 1;
  }

  return res;
}


int main(int /*argc*/, char **/*argv*/)
{
  cout << myFloor(-1234.01234) << " " << floor(-1234.01234) << endl;

  return 0;
}
票数 4
EN

Stack Overflow用户

发布于 2014-09-29 09:08:06

代码语言:javascript
复制
private static int fastFloor(double x) {
    int xi = (int)x;
    return x < xi ? xi - 1 : xi;
}

这是一种类似于Michal Crzardybons answer的方法,但它避免了条件分支,并且仍然正确地处理负数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5122993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档