根据DICOM标准,可以使用十进制字符串的值表示来存储浮点类型。请参阅表6.2-1DICOM值表示
十进制字符串:表示不动点数字或浮点数的字符串。不动点数字应只包含字符0-9,并带有可选的前导"+“或"-”和可选的“。标记小数点。浮点数应如ANSI X3.9中所定义的,用"E“或"e”表示指数的开始。十进制字符串可以用前导或尾随空格填充。不允许嵌入空间。 "0 "-“9”、"+“、”-“、"E”、"e“、”E“。以及默认字符库的空间字符。最大16字节
因此,我想简单地使用64位double (IEEE 754-1985)来表示C代码中内存中的值,这是基于输入最多存储在16个字节的事实。
对X3.9-1978有更多了解的人能证实这是最好的表示(与arbitrary-precision、float和/或long double相比)吗?最好的是,我的意思是表示是往返读/写将是视觉无损的。我应该能够从磁盘中读取这样的ASCII浮点表示,将其放入内存,并将其写回磁盘(如上面所指定的),与原始值(=机器epsilon (如果可能的话)相比)具有最大的精度。关于如何用16字节的存储空间将double表示为ASCII的实际实现细节超出了这个问题的范围,有关详细信息,请参阅这里。
发布于 2015-09-17 12:59:36
这在很大程度上是基于汉斯·帕桑特和马克·狄金森的评论。
使用任何浮点类型来表示十进制值通常是个坏主意,因为二进制浮点类型不能准确表示十进制值。通常不会使用它们来处理确切的货币值。
但是在这里,DICOM规范将限制设置为16个字符,当一个双位的精度大约是15-16小数位(参考)时。当您的十进制字符串包含一个符号(+/-),一个点(.)或者指数部分(e/E),你最多有15位小数,往返应该是正确的。只有当你有16位数字时,才会出现问题。Mark提供的示例是:16个字符的字符串9999999999999997和9999999999999996都将映射到相同的IEEE754 binary64浮点数。
TL/DR: Hans给出了一个很好的摘要:"16字节最大“是精确的有效数字,可以存储在一个双字节中。这个DICOM规范是为了让你使用双倍而写的。所以就用它吧
免责声明:IEEE754中所有可接受的值都将被正确处理,但请注意,对于DICOM十进制字符串,1e1024将是一个可接受的值,但它不能在双(限制在1e308)中表示。
https://stackoverflow.com/questions/32629084
复制相似问题