其他分享
首页 > 其他分享> > c – 在任何操作系统上IEEE的浮点数和双倍数都保证相同吗?

c – 在任何操作系统上IEEE的浮点数和双倍数都保证相同吗?

作者:互联网

我正在研究OS便携式数据库系统.我希望我们的数据库文件是可移植的操作系统,以便客户可以自行决定将其数据库文件移动到其他类型的操作系统.由于这个用例,我需要我的数据类型在OS之间保持一致,我想知道IEEE浮点数和双数字是否保证在任何操作系统上都是相同的字节大小?

解决方法:

C几乎没有说浮点类型的表示.

[basic.fundamental] / 8说(强调我的):

There are three floating point types: float, double, and long double. The type double provides at least as much precision as float, and the type long double provides at least as much precision as double. The set of values of the type float is a subset of the set of values of the type double; the set of values of the type double is a subset of the set of values of the type long double. The value representation of floating-point types is implementation-defined. Integral and floating types are collectively called arithmetic types. Specializations of the standard template std::numeric_limits (18.3) shall specify the maximum and minimum values of each arithmetic type for an implementation.

如果你只是使用float,double和long double编写C代码,除了特定编译器的文档中给出的那些,以及可以从std :: numeric_limits隐含的那些之外,几乎没有任何保证.

另一方面,IEEE 754提供了其浮点类型的行为和二进制表示的精确定义.这些定义不足以保证所有IEEE 754平台上的相同行为,因为(例如)IEEE 754有时允许将多个操作折叠在一起,而结果比分别执行两个操作更精确.这可能对您的具体情况不重要,因为您只是希望文件是可移植的,并且可能不太关心相同的查询对不同平台上的文件创建相同的更改,因为您正在加载相同的文件在不同平台上的相同方式.

所以问题是:“我如何获得C的便携式IEEE 754实现?”.

这个问题的答案有点棘手.合理平台的大多数C编译器将提供至少与IEEE 754的binary32和binary64规范大致匹配的float和double(尽管您需要阅读每个编译器的文档以确定).

或者,您可以使用软件浮点实现或包装器(如FLIP,libgcc’s soft-float,SoftFloatSTREFLOP).这些库有时仍会根据C标准对不完全可移植的实现进行假设,因此使用风险由您自行承担.

标签:c,portability,floating-point,posix
来源: https://codeday.me/bug/20191002/1845438.html