Как java хранит float v double

Я понимаю, что десятичное число может храниться с такой точностью только как число с плавающей запятой в двоичной системе, но я не понимаю, что происходит с 7-м десятичным знаком в моем выводе 10/7.

В моем первом тесте вывода я заметил, что 5 (7-е место) в конце числа с плавающей запятой против 4 (7-е место), за которым следует 2 в двойном. Я думаю, что 7-е место в поплавке будет 4, так как 8-е место в удвоении - 2.

Поплавковый 1.4285715 Двойной 1.4285714285714286

Затем я провел следующий выходной тест, используя формат с плавающей запятой, до 17 мест. 8-е место в каждом разное - поплавок равен 6, поэтому 7-е место округляется до 5, я полагаю.

Плавающий 1.428571462631225600 Двойной 1.428571428571428600

В третьем выходном тесте я попробовал прямое приведение к строковому формату, чтобы посмотреть, что произойдет. Я получил те же результаты, что и второй тест.

Если у меня есть упрощенный вопрос о сложном методе хранения с плавающей запятой, я прошу прощения.

    float f = 10/7f;
    double d = 10/7d;

    System.out.format
        ("Float  %1s\nDouble %2s\n", f,d);
    /*
     *  Float  1.4285715
        Double 1.4285714285714286
     */

    System.out.format
        ("Float  %1$.17f\nDouble %2$.17f\n", f,d);
    /*
     *  Float  1.428571462631225600
        Double 1.428571428571428600
     */

    System.out.format
        ("Float  %1s\nDouble %2s\n", (double)f,d);
    /*
     *  Float  1.4285714626312256
        Double 1.4285714285714286
     */

person user1178761    schedule 30.01.2012    source источник
comment
В чем именно заключается ваш вопрос? (Я не вижу никаких знаков вопроса в вашем сообщении...)   -  person maerics    schedule 30.01.2012
comment
Вот как хранится double: - en.wikipedia.org/wiki/Double-precision_floating-point_format   -  person Ali Imran    schedule 08.10.2013


Ответы (4)


В моем первом тесте вывода я заметил, что 5 (7-е место) в конце числа с плавающей запятой против 4 (7-е место), за которым следует 2 в двойном. Я думаю, что 7-е место в поплавке будет 4, так как 8-е место в удвоении - 2.

Это ожидание имеет смысл только в том случае, если вы думаете, что числа с плавающей запятой хранятся внутри в десятичном формате и округляются до некоторого количества десятичных цифр. Но это не так, числа с плавающей запятой хранятся внутри в двоичном формате и округляются до некоторого числа двоичных цифр.

Ваши ожидания основаны на непонимании того, как хранятся числа с плавающей запятой. Вы видите, что двойники имеют более точные десятичные разряды только потому, что это следствие того, что они имеют более точные двоичные разряды. Реализация вообще не хранит числа в десятичной форме.

person David Schwartz    schedule 30.01.2012
comment
Проголосовал за наиболее точное объяснение, объясняющее, почему это происходит. - person Louis Wasserman; 31.01.2012


Для упрощенного объяснения попробуйте этот сайт:

http://floating-point-gui.de/basic/

Для очень подробного объяснения попробуйте следующее:

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

person Gus    schedule 30.01.2012

Похоже, что когда вы используете float, для этого числа используется точность по умолчанию, равная 8 цифрам. Когда вы указываете точность, это дает понять, что на самом деле используется double для вычисления значения.

person Peter Lawrey    schedule 30.01.2012