Алгоритм для преобразования двойного IEEE 754 в строку? - PullRequest
19 голосов
/ 23 августа 2011

Многие языки программирования, использующие двойники IEEE 754, предоставляют библиотечную функцию для преобразования этих двойников в строки.Например, C имеет sprintf, C ++ имеет stringstream, Java имеет Double.toString и т. Д.

Внутренне, как эти функции реализованы?То есть, какой алгоритм (ы) они используют для преобразования двойного в строковое представление, учитывая, что они часто подчиняются выбранным программистом ограничениям точности?

Ответы [ 4 ]

16 голосов
/ 23 августа 2011

Я полагаю, вы ищете Быстрая и точная печать чисел с плавающей точкой

Я нашел эту ссылку в другом сообщении: здесь.

15 голосов
/ 23 августа 2011

Код, используемый различными программными средами для преобразования чисел с плавающей запятой в строковые представления, обычно основан на следующих публикациях (особенно часто цитируется работа Стила и Уайта):

Джером Т. Кунен:«Руководство по внедрению предлагаемого стандарта арифметики с плавающей точкой». Компьютер , вып.13, No. 1, January 1980, pp. 68-79

Guy.Л. Стил-младший и Дж. Уайт: «Как правильно печатать числа с плавающей запятой».В материалах ACM SIGPLAN '90 Конференция по разработке и внедрению языков программирования , Уайт-Плейнс, Нью-Йорк, июнь 1990 г., стр. 112-126

Дэвид М. Гэй: «Правильно округленные двоичные числа-десятичные и десятично-двоичные преобразования. "Технический отчет 90-10, AT & T Bell Laboratories, ноябрь 1990 г.

Некоторые соответствующие последующие работы:

Роберт Г. Бургер и Р. Кент Дибвиг: «Быстрая и точная печать чисел с плавающей точкой."В материалах конференции ACM SIGPLAN 1996 по разработке и внедрению языка программирования , Филадельфия, Пенсильвания, США, май 1996 г., стр. 108-116

Гай Л. Стил-младший и Джон Л.Белый: «Ретроспектива: как правильно печатать числа с плавающей точкой». ACM SIGPLAN Уведомления , Vol.39, № 4, апрель 2004 г., стр. 372–389

Флориан Лойч: «Быстрая и точная печать чисел с плавающей точкой с помощью целых чисел».В материалах конференции 2010 ACM SIGPLAN по разработке и внедрению языков программирования , Торонто, О.Н., Канада, июнь 2010 г., с. 233-243

Марк Андриско, Ранджит Джхала и Сорин Лернер:«Печать чисел с плавающей точкой: более быстрый, всегда правильный метод». ACM SIGPLAN Уведомления , Vol.51, № 1, январь 2016 г., стр. 555-567

Ульф Адамс: «Рю: быстрое преобразование с плавающей точкой в ​​строку». ACM SIGPLAN Уведомления , Vol.53, № 4, апрель 2018 г., стр. 270-282

3 голосов
/ 23 августа 2011

Для большинства примеров языков, которые вы цитируете, источник доступен для свободного просмотра в Интернете, поскольку они доступны в открытом исходном коде.

Для Java класс java.lang.Double делегирует эту работу sun.misc.FloatingDecimal . Проверьте его конструктор и метод toJavaFormatString ().

Для C, glibc всегда хороший пример, и мы видим , что вывод с плавающей запятой находится в его собственном исходном файле.

1 голос
/ 27 апреля 2018

См. Ryan Juckett's Печать чисел с плавающей точкой (2014), в которой описывается история и реализации преобразований с плавающей точкой в ​​строку. В этом посте, состоящем из четырех частей, Райан также представляет реализацию Dragon4 на C ++, основанную на Steele and White (1990) , которая является эффективным алгоритмом преобразования двоичного числа в формате с плавающей запятой в десятичное число в строке формат.


Вы также можете увидеть реализацию C Dragon Ryan для Numpy здесь и использовать ее в Python / Numpy 1.14 format_float_positional и format_float_scientific функций.

...