Подтвердить что ты не робот

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

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

Гай. L. Steele Jr. и J. L. White. Как точно печатать числа с плавающей запятой. В материалах конференции ACM SIGPLAN '90 по программированию и разработке языков программирования, страницы 112-126, White Plains, New York, June 1990.

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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


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