2012-04-27 29 views
0

将int非常接近1的浮点数乘以int> 0时,它是否可以解释为1.可以将0.999乘以时舍入为1吗?

也就是说,如果Math.random()返回其最高可能结果(即1步骤低于1.0),将

(int)(Math.random() * 8) 

是8或7?

对于一个实际的例子,可以在此经常使用的结构给出一个索引越界的错误:

someArray[(int)(Math.random() * someArray.length)]; 

我在为Java和ActionScript 3的答案特别感兴趣,但我想他们都使用浮点算法的相同规则以及任何平台的答案都是有用的。

更新:虽然我已经接受了一个答案,但我仍然希望确认这在ActionScript 3中不会出错,因为一个同事报告他看到它出错一次是什么部分促使我问这个问题题。

+3

您已接受的答案吗? – Paulpro 2012-04-27 20:58:45

+2

恩,“虽然我已经接受了答案”什么? – 2012-04-27 20:58:56

+0

你是什么意思? – 2012-04-27 21:01:03

回答

1

由于8是2的乘方,因此乘以float不会增加或移除该值的精度,除非溢出。乘以其他数字,特别是浮点数(除2的负幂,例如0.25,0.0625等)将降低精确度。

0

在java中使用Math.random(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Math.html),该值可以大于或等于0.0,并且小于1.0。

使用一个测试用值0.999999的值(INT)(的Math.random()* 8)为8。可以使用下一个代码测试实验

public static void main(String args[]) { 
     for (int i = 0; i <= 100; i++) { 
      double frac1=0.999999999999999999 ; 
      double frac=Math.random() ; 
      int integer=(int) (frac*8); 
      int integer1=(int) (frac1*8); 
      System.out.println(integer+"-"+frac); 
      System.out.println(integer1+"-"+frac); 
     } 
    } 

但是的Math.random() * 8可以返回其他值,如1,2,3,4,5,7或6,取决于为Math.random返回的值。您可以测试这个运行示例代码

+0

Did你检查'frac1'的实际值? – 2012-04-27 21:51:01

0

其实快速穷尽搜索可以证明,这是不可能发生的花车任何32位整数:

public static void main(String[] args) { 
    int repr = Float.floatToIntBits(1f) - 1; 
    float val = Float.intBitsToFloat(repr); 
    for (long i = 1; i <= -(long)Integer.MIN_VALUE; i++) { 
     if ((int) (val * i) == i) { 
      System.out.println("FOUND VALUE: " + i); 
     } 
     if ((int) (val * -i) == -i) { 
      System.out.println("FOUND VALUE: " + -i); 
     } 
     if (i % 100000000 == 0) { 
      System.out.println("Done: " + (double)i/Integer.MAX_VALUE); 
     } 
    } 
    // nothing printed 
}