primitives - java type conversion




Меняется ли точность при приведении int к двойному в Java? (2)

Вы можете iterate i пока не найдете двойное число 2**i , равное 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.

Что подтверждает принятый answer .

Обратите внимание, что в Javascript нет целочисленного типа, и вместо него используются двойные (они называются Number s). Если они достаточно велики, последовательные Number s могут быть равны друг другу .

Я прочитал это - Почему числа с плавающей точкой неточны?

Таким образом, иногда точность может быть изменена в числе с плавающей запятой из-за стиля представления (научная запись с показателем степени и мантиссой)

Но если я приведу целочисленное значение к удвоению, есть ли шанс немного изменить точность удвоения в Java?

Я имею в виду,

    int i = 3;
    double d = (double) i;

    System.out.println(d);

на выходе я получил 3.0 как и ожидал.

но есть ли шанс изменить точность, как 3.000001 из-за стиля представления double в Java?


Не для int, чтобы удвоить, но вы можете долго удваивать (или int для float):

  • Не все длинны больше 2^53-1 (или меньше -2^53 ) могут быть представлены в точности двойным;
  • Не все целые числа, больше чем 2^24-1 (или меньше чем -2^24 ), могут быть представлены точно с плавающей точкой.

Это ограничение возникает из-за количества бит, используемых для представления мантиссы (53 в двойных, 24 в плавающих).





precision