除IEEE754之外,是否还有其他常用的浮点格式?

时间:2018-06-24 08:37:22

标签: c++ types floating-point floating-point-conversion

我正在编写封送处理层,以在不同域之间自动转换值。当涉及浮点值时,这可能意味着将值从一种浮点格式转换为另一种。但是,似乎几乎每个现代系统都在使用IEEE754,所以我想知道是否值得推广其他格式,或者只是管理不同IEEE754格式之间的封送处理。

有人知道我应该考虑的除IEEE754之外的任何常用浮点格式(也许在ARM处理器或大型机上)吗?如果是这样,对格式规范的引用将非常有帮助。

3 个答案:

答案 0 :(得分:1)

几乎所有相对较新的(过去15年内)通用计算机都使用IEEE754。在极少数情况下,如果您发现需要支持的系统使用非IEEE 754浮点格式,则可能会有可用于与IEEE 754相互转换的库。

某些第5代(2002年底)之前未原生使用IEEE 754的非古代系统是Cray SV1(1998-2003)和IBM System 360、370和390。 IBM在2001年左右就在软件版本中为先前的S / 390硬件实现了IEEE 754 emulation

答案 1 :(得分:1)

到目前为止,您实际上希望该系统在什么系统上运行?如果您遇到一条不使用IEEE754的线路(就像@JohnZwinick所说的那样,几乎不会消失),那么您应该能够对此进行编码。

换句话说,实际上,您在这里设计的是通信协议,您显然希望就如何表示浮点数(两者都是单一的)做出明智的选择。精度和双精度,我猜想)在域之间传输的字节中。

我认为@SomeProgrammerDude试图暗示将它们表示为文本字符串(在传输过程中)可能提供最大的可移植性,如果可以的话,我同意,但这显然不是最有效的方法。 / p>

因此,如果您确实决定以IEEE754作为交换格式(如我所愿),那么可能发生的最坏情况是您可能需要找到一种方法来将它们转换成某种古董所用的本机格式几乎肯定不会遇到的架构,如果确实发生了,那么这个问题would not be not difficult to solve

另外,float和double可以是big-endian或little-endian,因此您需要确定将在字节流中使用的内容,并在必要时进行编组时进行转换。如今,小尾数(Little-endian)更常见,所以我会去做。

答案 2 :(得分:0)

  

有人知道我应该考虑的除IEEE754以外的任何常用浮点格式吗??

  1. CCSI对选定处理器使用binary32的变体。
  

似乎几乎每个现代系统都使用IEEE754,

  1. 是的,但是...各种实现对边缘值(例如subnormalsvisual studio中的负零,无穷大和not-a-number)的细节进行了模糊处理。

第二个问题更致命,更难辨认给定实现已完全编码为IEEE754。参见__STDC_IEC_559__

OP具有“我正在编写封送处理层”。正是在这种编码中,边缘情况仍然可能存在问题。同样,IEEE754没有指定 endian ,因此仍然存在封送处理问题。调用整数字节序可能与FP endian不匹配。