【发布时间】:2015-12-14 05:58:56
【问题描述】:
根据 DICOM 标准,可以使用十进制字符串的值表示来存储一种浮点类型。见Table 6.2-1. DICOM Value Representations:
十进制字符串:代表固定值的字符串 点数或浮点数。定点数应 仅包含字符 0-9 以及可选的前导“+”或“-” 和一个可选的“。”标记小数点。一个浮点数 应按照 ANSI X3.9 中的定义进行传送,用“E”或“e”表示 指示指数的开始。十进制字符串可以用 前导或尾随空格。不允许嵌入空格。
“0”-“9”、“+”、“-”、“E”、“e”、“.”和默认的空格字符 人物剧目。最大 16 个字节
所以我很想在我的 C 代码中简单地使用 64 位 double (IEEE 754-1985) 来表示内存中的值,因为输入最多存储在 16 个字节上。
对X3.9-1978 有更多了解的人能否确认这是最好的表示(与arbitrary-precision、float 和/或long double 相比)?最好,我的意思是表示往返读/写将是视觉上无损。我应该能够从磁盘读取这样的 ASCII 浮点表示,将其放入内存,然后将其写回磁盘(如上所述),与原始值相比具有最大的精度(= 机器 epsilon,如果可能的话)。关于如何将double 表示为只有 16 字节存储空间的 ASCII 的实际实现细节超出了本问题的范围,详情请参阅here..
【问题讨论】:
-
定义“最佳”,否则您的问题毫无意义。
-
IEEE 754 binary64 还不够好,无法往返所有这些值,但已经非常接近了。唯一可能丢失信息的地方是
9007199254740993和9999999999999999之间没有符号的奇数16 位整数。例如,16 个字符的字符串9999999999999997和9999999999999996都将映射到相同的 IEEE 754 binary64 浮点值。当您有符号、小数点或指数时,您就有 15 个或更少的有效数字,binary64 格式将忠实地处理这些数字。小于 2**53 的 16 位整数也是如此。
标签: c floating-point precision dicom