2012-04-27 52 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 
}