Алгоритм для преобразования IEEE 754 double в строку?
Многие языки программирования, использующие двойники IEEE 754, предоставляют библиотечную функцию для преобразования этих двойников в строки. Например, C имеет sprintf
, C++ имеет stringstream
Java имеет 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 всегда хороший пример, и мы видим, что вывод с плавающей запятой находится в его собственном исходном файле.