Tag: dicom

基于X3.9-1978标准的最佳IEEE 754-1985表示

根据DICOM标准,可以使用十进制字符串的值表示来存储一种浮点。 见表6.2-1。 DICOM价值表示 : 十进制字符串:表示固定点编号或浮点数的字符串。 固定点数应仅包含字符0-9,可选的前导“+”或“ – ”和可选的“。”。 标记小数点。 浮点数应按ANSI X3.9的规定传送,带有“E”或“e”表示指数的开始。 十进制字符串可以用前导或尾随空格填充。 不允许嵌入空格。 “0” – “9”,“+”,“ – ”,“E”,“e”,“。” 和默认字符保留曲目的SPACE字符。 最多16个字节 所以我很想简单地使用64位double ( IEEE 754-1985 )来表示我的C代码中的内存值,这是基于输入最多存储16个字节的事实。 那些对X3.9-1978更多了解的人X3.9-1978证实这是最好的表示(与arbitrary-precision , float和/或long double arbitrary-precision相比)吗? 最好的,我的意思是表示往返读/写将在视觉上无损 。 我应该能够从磁盘读取这样的ASCII浮点表示,将其放入内存,并将其写回磁盘(如上所述),与原始值(尽可能为机器epsilon)相比具有最大精度。 有关如何将double精度表示为只有16个字节的存储空间的实际实现细节超出了本问题的范围,请参阅此处了解详细信息。

在有限的16字节字符串上写入IEEE 754-1985 double作为ASCII

这是我原帖的后续内容 。 但为了清楚起见,我会重复一遍: 根据DICOM标准,可以使用十进制字符串的值表示来存储一种浮点。 见表6.2-1。 DICOM价值表示 : 十进制字符串:表示固定点编号或浮点数的字符串。 固定点数应仅包含字符0-9,可选的前导“+”或“ – ”和可选的“。”。 标记小数点。 浮点数应按ANSI X3.9的规定传送,带有“E”或“e”表示指数的开始。 十进制字符串可以用前导或尾随空格填充。 不允许嵌入空格。 “0” – “9”,“+”,“ – ”,“E”,“e”,“。” 和默认字符保留曲目的SPACE字符。 最多16个字节 标准是说文本表示是固定点与浮点。 该标准仅涉及在DICOM数据集本身中如何表示值。 因此,不需要将定点文本表示加载到定点变量中。 所以现在很明显,DICOM标准暗示推荐double (IEEE 754-1985)表示Decimal String类型的Value Representation (最多16位有效数字)。 我的问题是如何使用标准CI / O库将这个二进制表示从内存转换回ASCII到这个有限大小的字符串? 从互联网上的随机来源来看,这是非常重要的,但普遍接受的解决方案是: printf(“%1.16e\n”, d); // Round-trippable double, always with an exponent 要么 printf(“%.17g\n”, d); // Round-trippable double, shortest possible 当然,在我的情况下,两个表达式都是无效的,因为它们可以产生比我有限的最大16个字节更长的输出。 那么, […]