Запись 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.0095729050923877828
compute2.c
приводит к общей сумме ошибок:0.21764383725715469
compute3.c
приводит к общей сумме ошибок:4.050031792674619
compute4.c
приводит к общей сумме ошибок:0.001287056579548422
Такcompute4.c
приводит к максимально возможной точности (0,001287056579548422 <4.050031792674619), но в три раза (х3) к общему времени выполнения (тестируется только в режиме отладки с использованиемtime
команда).