c – 在任何操作系统上IEEE的浮点数和双倍数都保证相同吗?
作者:互联网
我正在研究OS便携式数据库系统.我希望我们的数据库文件是可移植的操作系统,以便客户可以自行决定将其数据库文件移动到其他类型的操作系统.由于这个用例,我需要我的数据类型在OS之间保持一致,我想知道IEEE浮点数和双数字是否保证在任何操作系统上都是相同的字节大小?
解决方法:
C几乎没有说浮点类型的表示.
[basic.fundamental] / 8说(强调我的):
There are three floating point types:
float
,double
, andlong double
. The typedouble
provides at least as much precision asfloat
, and the typelong double
provides at least as much precision as double. The set of values of the typefloat
is a subset of the set of values of the typedouble
; the set of values of the typedouble
is a subset of the set of values of the typelong double
. The value representation of floating-point types is implementation-defined. Integral and floating types are collectively called arithmetic types. Specializations of the standard templatestd::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,SoftFloat或STREFLOP).这些库有时仍会根据C标准对不完全可移植的实现进行假设,因此使用风险由您自行承担.
标签:c,portability,floating-point,posix 来源: https://codeday.me/bug/20191002/1845438.html