Cal*_*ius 23 c floating-point ieee-754
浮点是在C中定义的实现.因此没有任何保证.
我们的代码需要是可移植的,我们正在讨论在我们的协议中使用IEEE754浮点数是否可以接受.出于性能原因,如果我们不必在发送或接收数据时在固定点格式之间来回转换,那将是很好的.
虽然我知道平台和架构之间可能存在关于long或的大小的差异wchar_t.但我似乎无法找到任何具体的float和double.
到目前为止我发现字节顺序可能在大端平台上被反转.虽然有不带浮动包含代码,其中点支撑平台float和double甚至无法链接.否则平台似乎坚持IEEE754单精度和双精度.
那么可以假设浮点数在IEEE754可用时安全吗?
编辑:回应评论:
你对"安全"的定义是什么?
安全我的意思是,一个系统上的位模式在另一个系统上意味着相同(在字节旋转之后处理字节序).
Sne*_*tel 25
基本上所有当前非穿卡使用的架构,包括嵌入式架构和外来信号处理架构,都提供了两个浮点系统之一:
最常见的便宜货:
a-b如果可以准确表示的定理a),但在实践中它通常不会成为问题.b和inf特殊.这些体系结构将无法遵循关于操作数NaN和inf操作数的规则,并且可能不会饱和NaN,而是产生大于的数字inf,这通常会被其他体系结构识别为FLT_MAX.BUUUUT ......即使是那些除了blah架构之外的人仍然使用IEEE-754的数字表示.除了字节排序问题之外,描述架构A NaN或float架构A的位基本上保证在架构B上具有相同的含义.
所以只要你关心的只是价值观的代表,你就完全没问题了.如果您关心跨平台操作的一致性,您可能需要做一些额外的工作.
编辑:正如Chux在评论中提到的,平台之间常见的额外不一致来源是使用扩展精度,例如x87的80位内部表示.这与廉价的相反,并且(通过适当的处理)完全符合IEEE-754和C标准,但它同样会导致架构之间的结果不同,甚至在编译器版本之间以及显然是次要和不相关的代码之间变化.但是:由于扩展的精度,特定的x86/x64可执行文件不会在不同的处理器上产生不同的结果.
有一个要检查的宏(自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双格式.
| 归档时间: |
|
| 查看次数: |
1693 次 |
| 最近记录: |