2015-01-15 2 views
3

Я издеваюсь над статическим методом random() класса Java в Java, чтобы лучше протестировать метод, основанный на генерации случайных чисел. Код, я использую выглядит следующим образом:Имитировать наибольшее значение Math.random()

@Mock 
public double random() { 
    return 1.0 - Double.MIN_VALUE; 
} 

Это моя попытка достичь значение как можно ближе к 1,0, как это возможно, не равны. (например, 0.999999999999 ...)

Однако, когда я вызываю посмеянный метод Math.random(), я всегда получаю 1.0 в качестве значения. Это почти так, как будто вычитание Double.MIN_VALUE не влияет на 1.0 вообще.

Почему 1.0 - Double.MIN_VALUE результат 1.0 и как я могу имитировать максимально возможное значение Math.random()?

+0

См. Также http://stackoverflow.com/questions/7288334/increase-a-double-to-the-next-closest-value – Raedwald

+0

См. Также http: // stackoverflow .com/questions/155378/how-to-alter-a-float-by-its-smallest-increment-or-close-to-it – Raedwald

+0

Возможный дубликат [Java: Math.random() Max Value (double just less чем 1)] (http://stackoverflow.com/questions/15736885/java-math-random-max-value-double-just-less-than-1) – Raedwald

ответ

2

double имеет предел точности. Ближайшее число до 1.0 - Double.MIN_VALUE, которое может быть представлено как double, равно 1.0. Вот почему вы получаете 1.0.

Двойник имеет 1 бит для знака, 11 бит для экспоненты и 52 бит для фракции. (Source)

Двойное значение, представленное 64 битов (-1)^sign+1.b51b50...b0 x 2^(e-1023)

Наиболее близким к 1,0 вы можете получить, когда все фракции биты равны 1, а показатель степени e-1023==-1. Это значение равно 0.1111..111 (53 единицы) в двоичном формате.

Чтобы получить это значение в десятичной системе счисления:

double d = 0.0; 
double exp =1.0; 
for (int i=1;i<=53;i++) { 
    exp=exp*2.0; 
    d+=1.0/exp; 
} 
System.out.println (d); 
System.out.println ("d==1.0? " + (d==1.0)); 

Он печатает

0.9999999999999999 
d==1.0? false 

Если добавить еще одну итерацию в цикле (т.е. i<=54) вы получите:

1.0 
d==1.0? true 
+0

Тогда каково максимальное возможное значение, возвращаемое 'Math. случайным образом() '? – terminex9

1

По IEEE 754 double имеет 15.95 Десятичные цифры

http://en.wikipedia.org/wiki/IEEE_floating_point

так что если вы попытаетесь double a = 1e0 - 1e-16 //or less вы будете иметь == 1E0

+1

Звучит неплохо. Использование '1.0 - 1e-15' генерирует значение меньше 1,0 – terminex9

1

double не является достаточно точным, чтобы показать вам сгенерированный номер при выполнении 1.0 - Double.MIN_VALUE. Это указывается here при обсуждении примитивных типов Java. Вы также можете найти этот ответ интересным: https://stackoverflow.com/a/15736977/4381697

Смежные вопросы