基于X3.9-1978标准

时间:2015-09-17 11:20:15

标签: c floating-point precision dicom

根据DICOM标准,可以使用十进制字符串的值表示来存储一种浮点。见Table 6.2-1. DICOM Value Representations

  

十进制字符串:表示固定字符的字符串   点号或浮点数。固定点数应   仅包含字符0-9,带有可选的前导" +"或" - "   和一个可选的"。"标记小数点。浮点数   应按照ANSI X3.9的规定进行传送,并使用" E"或者" e"至   表示指数的开始。十进制字符串可以填充   前导或尾随空格。不允许使用嵌入式空间。

     

" 0" - " 9"," +"," - "," E", " e","。"和默认的SPACE字符   角色保留曲目。最多16个字节

所以我很想简单地使用64位doubleIEEE 754-1985)来表示我的C代码中的内存中的值,这是基于输入最多存储16个字节的事实

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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