代码之家  ›  专栏  ›  技术社区  ›  user283145

将float转换为int:复杂情况下的舍入(ceil()和floor()不可用)

  •  1
  • user283145  · 技术社区  · 14 年前

    我要将浮点值转换为它的整数表示形式。由于这将用于比较,因此默认的舍入模式(舍入到最近的)不适合我。据我所知,我不能以C++标准的方式指定FPU的舍入模式(甚至不在C++0X中)。实现这一点的其他方法是什么?其中哪一种是最便携的?我在Linux、GCC、i386+x86-64上编程。

    谢谢!

    编辑

    我对圆向无穷大和圆向无穷大取整模式感兴趣,我希望每次都能选择其中一种模式。

    7 回复  |  直到 14 年前
        1
  •  2
  •   avakar    14 年前

    如果两者 12.3 14.7 在IEEE754中,两者都是浮点数 13.0 14.0 是浮点数(更一般地说:给定两个非整数浮点数,其中的所有整数也都是浮点数)。因此,根据IEEE754, floor ceil 始终正确工作(请注意,x86使用IEEE754表示)。

    如果您不符合IEEE754,请注意 地板 说(c99:7.12.9.2/3,我手边没有c90)

    floor函数返回不大于x的最大整数值,以浮点数表示。

    我不知道如何解释,如果不大于x的最大整数值不能精确表示。

        2
  •  2
  •   Aif    14 年前

    你应该使用 floor ceil . 原型是 int floor或int ceil,但它们确实返回一个整数值。

    #include <math.h>
    #include <stdio.h>
    
    int main()
    {
            float x = 6.04;
            printf("floor = %f ceil = %f\n", floor(x), ceil(x));
            return 0;
    }
    

    生产:

    $ ./test 
    floor = 6.000000 ceil = 7.000000
    

    所以你现在必须给出答案。

        3
  •  2
  •   groovingandi    14 年前

    从c99开始 llrint() 使用当前的舍入模式(可通过以下方式设置)将其舍入到下一个(长整型)整数 fesetround() )

        4
  •  1
  •   Will    14 年前

    必须指定舍入的类型 想要。

    从以下方面考虑:

    1. 采用浮点变量

    2. 把它适当地围起来

    3. 强制转换为整数将得到浮点值的整数部分-it 截断 价值

    你可以看看 floor() ceil() 分别进行四舍五入和四舍五入。

    你必须特别注意你想在0和负数附近发生什么。

    GLIBC有 lots of rounding functions 可用。

    下面是一个向无穷大函数的圆:

    int round_towards_infinity(double value) {
      if(value > 0)
         return ceil(value);
      return floor(value);
    }
    
        5
  •  0
  •   BЈовић    14 年前

    可能是这样:

    #include <cmath>
    
    int Round( const double a )
    {
      return static_cast< int >( std::floor( a + 0.5 ) );
    }
    
        6
  •  0
  •   Kaz Dragon    14 年前

    我一直被教导要使用的转换(尽管我相信适当的浮点数学家会为它开枪)是:

    float x = ....;
    int   y = int(x + 0.5f);
    

    快速浏览一下我的参考资料,就会发现C99有一个“lrint”函数系列,它接受浮点值并返回长整数。这可能是你想要的。

        7
  •  0
  •   Michael Anderson    14 年前

    听起来你得做些小动作才能得到正确的答案。提取浮点数的指数,并使用该指数将尾数的位模式移动正确的数值。您可能需要执行一些额外的技巧来处理+/-无穷大、溢出和非规范化的值…但这听起来像是一条痛苦的道路……如果你真的不必走的话,我不会走的。