基于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位doubleIEEE 754-1985 )来表示我的C代码中的内存值,这是基于输入最多存储16个字节的事实。

那些对X3.9-1978更多了解的人X3.9-1978证实这是最好的表示(与arbitrary-precisionfloat和/或long double arbitrary-precision相比)吗? 最好的,我的意思是表示往返读/写将在视觉上无损 。 我应该能够从磁盘读取这样的ASCII浮点表示,将其放入内存,并将其写回磁盘(如上所述),与原始值(尽可能为机器epsilon)相比具有最大精度。 有关如何将double精度表示为只有16个字节的存储空间的实际实现细节超出了本问题的范围,请参阅此处了解详细信息。

这主要基于Hans Passant和Mark Dickinson的评论。

使用任何浮点类型来表示十进制值通常是个坏主意,因为二进制浮点类型不能精确地表示十进制值。 通常不会使用它们来处理确切的货币价值。

但是在这里,DICOM规范将限制设置为16个字符,当double的精度约为15-16个十进制数字( 参考 )。 只要您的十进制字符串包含一个符号(+/-),一个点(。)或指数部分(e / E),您将最多有15个十进制数字,并且往返应该是正确的。 当您有16位数时,应该发生唯一的问题。 Mark Dickinson提供的示例是: 16个字符的字符串99999999999999979999999999999996都映射到相同的IEEE 754 binary64浮点值。

TL / DR:Hans Passant给出了一个很好的摘要: “最多16个字节”[是]可以存储在双精度中的准确有效数字。 编写这个DICOM规范是为了让你使用double。 所以只需使用它


免责声明:IEEE 754中可接受的所有值都将被正确处理,但要注意, 1e1024将是DICOM十进制字符串的可接受值,但它不能用双精度表示(约为1e308)。