根据DICOM标准,可以使用十进制字符串的值表示来存储一种浮点。见Table 6.2-1. DICOM Value Representations:
十进制字符串:表示固定字符的字符串 点号或浮点数。固定点数应 仅包含字符0-9,带有可选的前导" +"或" - " 和一个可选的"。"标记小数点。浮点数 应按照ANSI X3.9的规定进行传送,并使用" E"或者" e"至 表示指数的开始。十进制字符串可以填充 前导或尾随空格。不允许使用嵌入式空间。
" 0" - " 9"," +"," - "," E", " e","。"和默认的SPACE字符 角色保留曲目。最多16个字节
所以我很想简单地使用64位double
(IEEE 754-1985
)来表示我的C代码中的内存中的值,这是基于输入最多存储16个字节的事实
对X3.9-1978
有更多了解的人可以确认这是最好的代表(与arbitrary-precision
,float
和/或long double
相比)吗?最好的,我的意思是表示往返读/写将视觉无损。我应该能够从磁盘读取这样的ASCII浮点表示,将其放入内存,并将其写回磁盘(如上所述),与原始值(=可能的机器epsilon)相比具有最大精度。有关如何将double
表示为仅包含16个字节存储空间的ASCII的实际实现细节超出了本问题的范围,有关详细信息,请参阅here。
答案 0 :(得分:4)
这主要基于Hans Passant和Mark Dickinson的评论。
使用任何浮点类型来表示十进制值通常是一个坏主意,因为二进制浮点类型不能完全表示十进制值。通常不会使用它们来处理确切的货币价值。
但是在这里,DICOM规范将限制设置为16个字符,当double的精度约为15-16个十进制数字(ref.)时。只要您的十进制字符串包含一个符号(+/-),一个点(。)或指数部分(e / E),您将最多有15个十进制数字,并且往返应该是正确的。当您有16位数字时,应该发生唯一的问题。 Mark Dickinson提供的示例是: 16个字符的字符串9999999999999997
和9999999999999996
都映射到相同的IEEE 754 binary64浮点值。
TL / DR:Hans Passant给出了一个很好的摘要:“最多16个字节”[是]你可以存储在双精度中的准确有效数字。编写这个DICOM规范是为了让你使用double。所以只需使用它
免责声明:IEEE 754中可接受的所有值都将被正确处理,但要注意,1e1024
将是DICOM十进制字符串的可接受值,但它不能表示为双精度(约为1e308)。