Как двоичные числа с плавающей запятой (IEEE 754) преобразуются в десятичную (т.е. в строку)? - PullRequest
0 голосов
/ 01 декабря 2019

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

Допустим, у меня есть литерал с плавающей запятой двойной точности: 5.21. Вызов Double.toString( 5.21 ) в Java дает строку "5.21".

Теперь, скажем, у нас есть Java, но без toString и valueOf, и я не могу отформатировать ее с String.format или просто путем конкатенации,Как бы я мог преобразовать свой номер в строку, предполагая, что у меня есть только двоичное представление?

В частности, как именно Double.toString и dtoa точно работают: как я могу написать свой собственный toString / dtoa функция (при условии, что мы имеем дело с плавающей точкой двойной точности IEEE 754)?

1 Ответ

3 голосов
/ 02 декабря 2019

Это удивительно сложная проблема, особенно для того, чтобы сделать это эффективно и точно. Существуют две основные проблемы:

  1. Каждый двоичный тип с плавающей точкой представляет собой набор «реальных» чисел, центрированных вокруг него, и размер этого интервала зависит от самого значения. (Как правило, чем больше значение, тем больше интервал, который он представляет.) «Правильное» преобразование обычно определяется как выбор элемента из этого набора, который будет содержать много десятичных чисел с плавающей запятой.

  2. Из «правильных» выборов обычно требуется «оптимальный» вывод, т. Е. Строка с наименьшим количеством десятичных цифр.

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

Но вам повезло. Это также очень хорошо изученная проблема:

Это удивительночто первая и последняя статья выше разделены на 20 лет, что свидетельствует о сложности проблемы. Если вы придумаете лучшую технику, это определенно будет опубликованным результатом. Наслаждайтесь!

...