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

浇铸到内部vs地板

  •  100
  • OgreSwamp  · 技术社区  · 14 年前

    这两者之间有什么区别吗

    float foo1 = (int)(bar / 3.0);
    float foo2 = floor(bar / 3.0);
    

    据我所知,这两种情况都有相同的结果。编译后的代码有什么不同吗?

    7 回复  |  直到 10 年前
        1
  •  215
  •   Matt Ball    10 年前

    强制转换为int将向零截断。 floor() 将向负无穷方向截断。这将为您提供不同的值,如果 bar 结果是阴性。

        2
  •  33
  •   brice rebsamen    11 年前

    正如前面所说的,正数是相同的,负数则不同。规则是int朝着0旋转,而floor朝着负无穷大旋转。

    floor(4.5) = (int)4.5 = 4
    floor(-4.5) = -5 
    (int)(-4.5) = -4
    

    我的代码需要有限范围的值(包括负数)的底层操作。它需要非常高效,所以我们使用以下函数:

    int int_floor(double x) 
    { 
        return (int)(x+100000) - 100000; 
    }
    

    当然,对于非常大的x值(您将遇到一些溢出问题)和-100000以下的负值等,这将失败。但是我已经计时它至少比floor快3倍,这对于我们的应用程序来说非常关键。把它与盐粒,测试它在您的系统等,但它是值得考虑的IMHO。

        3
  •  10
  •   AndersK    6 年前

    float foo = (int)(bar / 3.0) //will create an integer then assign it to a float
    
    float foo = fabs(bar / 3.0 ) //will do the absolute value of a float division
    
    bar = 1.0
    
    foo1 = 0;
    foo2 = 0.33333...
    
        4
  •  4
  •   Amardeep AC9MF    14 年前

    编辑:因为问题可能已经被修改,因为混淆了 fabs() floor() .

    给出原始问题示例行:

    1.  float foo = (int)(bar / 3.0);
    
    2.  float foo = fabs(bar / 3.0);
    

    不同的是,如果条形图为负,则第一个条形图的结果为负,而第二个条形图的结果为正。第一个将被截断为整数,第二个将返回包含小数部分的完整十进制值。

        5
  •  3
  •   warrenm    14 年前

    对。 fabs 返回其参数的绝对值,强制转换为int会导致除法的截断(精确到最接近的int),因此结果几乎总是不同的。

        6
  •  2
  •   abligh    10 年前

    1. 正如其他人所指出的,强制转换为整数将向零截断,而 floor() 总是朝着负无穷远截断;对于负操作数,这是不同的行为。

    2. MAX_INT+1 (或小于 -MAX_INT-1 )然后投出一个 int 是32位,则只有一个符号位加上31位数据。所以用这个和 double 规模太大会产生意想不到的结果。

        7
  •  0
  •   Winter    7 年前

    (int) x x (此处没有舍入)

    fabs(x) =| x |因此 >= 0 ;

    前任: (int) -3.5 退货 -3 fabs(-3.5) 退货 3.5 ;

    一般来说, fabs (x) >= x

    x >= (int) x 如果 x >= 0

    x < (int) x 如果 x < 0