【问题标题】:Best IEEE 754-1985 representation for X3.9-1978 based standard基于 X3.9-1978 的标准的最佳 IEEE 754-1985 表示
【发布时间】: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-precisionfloat 和/或long double 相比)?最好,我的意思是表示往返读/写将是视觉上无损。我应该能够从磁盘读取这样的 ASCII 浮点表示,将其放入内存,然后将其写回磁盘(如上所述),与原始值相比具有最大的精度(= 机器 epsilon,如果可能的话)。关于如何将double 表示为只有 16 字节存储空间的 ASCII 的实际实现细节超出了本问题的范围,详情请参阅here..

【问题讨论】:

  • 定义“最佳”,否则您的问题毫无意义。
  • IEEE 754 binary64 还不够好,无法往返所有这些值,但已经非常接近了。唯一可能丢失信息的地方是90071992547409939999999999999999 之间没有符号的奇数16 位整数。例如,16 个字符的字符串 99999999999999979999999999999996 都将映射到相同的 IEEE 754 binary64 浮点值。当您有符号、小数点或指数时,您就有 15 个或更少的有效数字,binary64 格式将忠实地处理这些数字。小于 2**53 的 16 位整数也是如此。

标签: c floating-point precision dicom


【解决方案1】:

这在很大程度上基于 Hans Passant 和 Mark Dickinson 的 cmets。

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

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

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


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

【讨论】:

    猜你喜欢
    • 2019-05-11
    • 2018-08-07
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2013-12-02
    • 2021-10-06
    • 2021-07-15
    • 2021-03-19
    相关资源
    最近更新 更多