Алгоритм для преобразования IEEE 754 double в строку?

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

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

Спасибо!

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

Другие вопросы по тегам