Вы можете повторять над i
, пока не найдете 2**i
double, равный 2**i + 1
:
import java.util.stream.IntStream;
public class PrecisionLoss
{
public static void main(String[] args) {
double epsilon = 1;
Integer maxInt = IntStream.iterate(0, i -> i + 1)
.filter(i -> Math.pow(2, i) == Math.pow(2, i) + epsilon)
.findFirst().getAsInt();
System.out.println("Loss of precision is greater than " + epsilon
+ " for 2**" + maxInt + " when using double.");
}
}
. Вывод:
Loss of precision is greater than 1.0 for 2**53 when using double.
Что подтверждает принятый ответ .
Обратите внимание, что в Javascript нет целочисленного типа и вместо него используются двойные (они называются Number
s).Если они достаточно велики, последовательные Number
могут быть равными друг другу .