Запись IEEE 754-1985 в качестве ASCII с двойной строкой из 16 байтов

Это продолжение моегооригинальный пост, Но я повторю это для ясности:

Согласно стандарту DICOM, тип с плавающей запятой может быть сохранен с использованием представления значения десятичной строки. УвидетьТаблица 6.2-1. Значения DICOM:

Десятичная строка: строка символов, представляющая либо число с фиксированной запятой, либо число с плавающей запятой. Число с фиксированной точкой должно содержать только символы 0-9 с необязательным начальным «+» или «-» и необязательным «.» отметить десятичную точку. Число с плавающей запятой должно передаваться, как определено в ANSI X3.9, с «E» или «e», чтобы указать начало показателя степени. Десятичные строки могут быть дополнены начальными или конечными пробелами. Встроенные пространства не допускаются.

«0» - «9», «+», «-», «E», «e», «.» и символ ПРОБЕЛ в репертуаре символов по умолчанию. Максимум 16 байтов

Стандарт говорит, чтотекстовое представление является фиксированной точкой по сравнению с плавающей точкой. Стандарт относится только к тому, как значения представлены в самом наборе данных DICOM. Таким образом, нет необходимости загружать текстовое представление с фиксированной точкой в ​​переменную с фиксированной точкой.

Так что теперь это ясно, что стандарт DICOM косвенно рекомендуетdouble (IEEE 754-1985) для представленияValue Representation типаDecimal String (максимум 16 значащих цифр). Мой вопрос заключается в том, как использовать стандартную библиотеку C I / O для преобразования этого двоичного представления из памяти в ASCII в эту строку ограниченного размера?

Из случайного источника в Интернете, это нетривиально, но в целомпринятое решение это либо:

printf("%1.16e\n", d); // Round-trippable double, always with an exponent

или же

printf("%.17g\n", d); // Round-trippable double, shortest possible

Конечно, оба выражения недопустимы в моем случае, так как они могут производить вывод гораздо дольше, чем мой ограниченный максимум16 байт, Так, каково решениеминимизировать потери в точности при записи произвольного двойного значения в строку из 16 байтов?

редактироватьЕсли это не ясно, я обязан следовать стандарту. Я не могу использовать кодировку hex / uuencode.

Редактировать 2: Я запускаю сравнение с помощью travis-ci см .:Вот

Пока что предложенные коды:

Серж БаллестаchuxМарк Дикинсонchux

Результаты, которые я вижу здесь:

compute1.c приводит к общей сумме ошибок:0.0095729050923877828compute2.c приводит к общей сумме ошибок:0.21764383725715469compute3.c приводит к общей сумме ошибок:4.050031792674619compute4.c приводит к общей сумме ошибок:0.001287056579548422

Такcompute4.c приводит к максимально возможной точности (0,001287056579548422 <4.050031792674619), но в три раза (х3) к общему времени выполнения (тестируется только в режиме отладки с использованиемtime команда).

Ответы на вопрос(5)

Ваш ответ на вопрос