Я написал некоторый Java-код для генерации псевдослучайных чисел, но столкнулся с тем, что, как мне кажется, возникают проблемы с округлением, чтобы он соответствовал тому же коду в Ruby. Вот что у меня есть в Java:
public class randTest {
private final static Double A = Math.pow(5,13);
private final static Integer S = 314159265;
private final static Double minVal = Math.pow(2, -46);
private final static Double maxVal = Math.pow(2, 46);
private final static Double newMax = 10.0;
private static Double r(Integer k) {
Double powS = Math.pow(A, k) * S;
Double xk = powS % maxVal.intValue();
Double result = minVal * xk;
System.out.println("k = " + k + ", pows = " + powS + ", xk = " + xk + ", result = " + result);
return result;
}
}
И то же самое в Ruby (моя рабочая рабочая реализация):
A = 5 ** 13
S = 314159265
MIN_VAL = 2 ** -46
MAX_VAL = 2 ** 46
NEW_MAX = 10
def r(k) # was generate_random
powS = (A ** k) * S
xk = powS % MAX_VAL
result = MIN_VAL * xk
puts "k = #{k}, pows = #{powS}, xk = #{xk}, result = #{result}"
return result
end
По какой-то причине выходные данные сильно отличаются (но Ruby правильный). Вот я звоню г (4):
Java:
k = 4, pows = 6.9757369880463215E44, xk = 1.512592341E9, result = 2.1495230001278287E-5
Ruby:
k = 4, pows = 697573698804632158498861826956272125244140625, xk = 55279057169489, result = 0.785562650228954
Есть идеи, почему powS
будет правильно вычисляться в обоих, но не xk
? Обратите внимание, что в Java-версии мне нужно было использовать maxVal.intValue()
вместо maxVal
, иначе он возвращает ноль. Я также пытался заменить Double
s на BigDecimal
s, но безрезультатно.