Меняется ли точность при приведении int к двойному в Java? - PullRequest
0 голосов
/ 06 июня 2018

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

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

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

Я имею в виду,

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

    System.out.println(d);

вывод, который я получил 3.0, как я и ожидал.

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

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вы можете повторять над 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 могут быть равными друг другу .

0 голосов
/ 06 июня 2018

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

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

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

...