假设使用C中的IEEE754浮点表示浮点数是否安全?

Cal*_*ius 23 c floating-point ieee-754

浮点是在C中定义的实现.因此没有任何保证.

我们的代码需要是可移植的,我们正在讨论在我们的协议中使用IEEE754浮点数是否可以接受.出于性能原因,如果我们不必在发送或接收数据时在固定点格式之间来回转换,那将是很好的.

虽然我知道平台和架构之间可能存在关于long或的大小的差异wchar_t.但我似乎无法找到任何具体的floatdouble.

到目前为止我发现字节顺序可能在大端平台上被反转.虽然有不带浮动包含代码,其中点支撑平台floatdouble甚至无法链接.否则平台似乎坚持IEEE754单精度和双精度.

那么可以假设浮点数在IEEE754可用时安全吗?

编辑:回应评论:

你对"安全"的定义是什么?

安全我的意思是,一个系统上的位模式在另一个系统上意味着相同(在字节旋转之后处理字节序).

Sne*_*tel 25

基本上所有当前非穿卡使用的架构,包括嵌入式架构和外来信号处理架构,都提供了两个浮点系统之一:

  • IEEE-754.
  • IEEE-754 除了等等.也就是说,他们大多实现了754,但是在一些更昂贵和/或繁琐的位上便宜了.

最常见的便宜货:

  • 将非正规数刷新为零.这使某些有时有用的定理无效(特别是a-b如果可以准确表示的定理a),但在实践中它通常不会成为问题.
  • 不承认binf特殊.这些体系结构将无法遵循关于操作数NaNinf操作数的规则,并且可能不会饱和NaN,而是产生大于的数字inf,这通常会被其他体系结构识别为FLT_MAX.
  • 正确舍入除法和平方根.确保结果在精确结果的1-3 ulps内比在1/2 ulp内更容易.一个特别常见的情况是将除法实现为倒数+乘法,这会损失一点精度.
  • 更少或没有保护数字.这是一个不寻常的廉价,但意味着其他操作可以1-2卢比.

BUUUUT ......即使是那些除了blah架构之外的人仍然使用IEEE-754的数字表示.除了字节排序问题之外,描述架构A NaNfloat架构A的位基本上保证在架构B上具有相同的含义.

所以只要你关心的只是价值观的代表,你就完全没问题了.如果您关心跨平台操作的一致性,您可能需要做一些额外的工作.

编辑:正如Chux在评论中提到的,平台之间常见的额外不一致来源是使用扩展精度,例如x87的80位内部表示.这与廉价的相反,并且(通过适当的处理)完全符合IEEE-754和C标准,但它同样会导致架构之间的结果不同,甚至在编译器版本之间以及显然是次要和不相关的代码之间变化.但是:由于扩展的精度,特定的x86/x64可执行文件不会在不同的处理器上产生不同的结果.

  • @BasileStarynkevitch记得很清楚.:) IBM确实将他们疯狂的基础16系统带到了当天,但仅作为向后兼容性选项.除非你不顾一切地使用它,否则你将使用普通的base-2浮标. (3认同)
  • 嵌入式示例"cheap-out":而不是inf/NaN,这些位模式简单表示具有"IEEE754_max_exponent + 1"指数的数字.另请参见[非IEEE-754](https://www.ccsinfo.com/faq.php?page=mchp_float_format)示例. (2认同)

Yu *_*Hao 7

有一个要检查的宏(自C99起):

C11§6.10.8.3条件特征宏

__STDC_IEC_559__ 整数常数1,用于表示符合附录F(IEC 60559浮点运算)中的规范.

IEC 60559(ISO/IEC/IEEE 60559的缩写)是IEEE-754的另一个名称.

然后,附件F建立C浮动类型和IEEE-754类型之间的映射:

C浮动类型符合IEC 60559格式,如下所示:

  • 浮点类型符合IEC 60559单一格式.
  • 双重类型符合IEC 60559双重格式.
  • long double类型匹配IEC 60559扩展格式,357)否则是非IEC 60559扩展格式,否则是IEC 60559双格式.

  • 该宏可能不会[总是有用](http://stackoverflow.com/questions/19955968/why-is-math-pow0-0-1/19955996#comment29710753_19956041) (4认同)
  • @Calmarius可能是因为它不支持C99. (3认同)