2 c++ floating-point portability posix
我正在研究OS便携式数据库系统.我希望我们的数据库文件是可移植的操作系统,以便客户可以自行决定将其数据库文件移动到其他类型的操作系统.由于这个用例,我需要我的数据类型在OS之间保持一致,我想知道IEEE浮点数和双数字是否保证在任何操作系统上都是相同的字节大小?
[basic.fundamental]/8 说(强调我的):
有三种浮点类型:
float,double,和long double.该类型double提供至少与精度一样多的精度float,并且该类型long double提供至少与double一样多的精度.该类型的值float集是该类型的值集的子集double; 类型的值double集是该类型的值集的子集long double.浮点类型的值表示是实现定义的.积分和浮动类型统称为算术类型.标准模板std::numeric_limits(18.3)的特化应指定实现的每种算术类型的最大值和最小值.
如果您只是使用编写C++代码float,double并且long double几乎没有任何保证,除了特定编译器的文档中给出的那些,以及可以隐含的那些std::numeric_limits.
另一方面,IEEE 754提供了其浮点类型的行为和二进制表示的精确定义.这些定义并不是很不足以保证在所有IEEE 754的平台相同的行为,因为(例如)IEEE 754有时允许多个操作被折叠在一起时,结果将是不是分开执行两个操作更精确.这可能对您的具体情况不重要,因为您只是希望文件是可移植的,并且可能不太关心相同的查询对不同平台上的文件创建相同的更改,因为您正在加载相同的文件在不同平台上的相同方式.
这个问题的答案有点棘手.用于合理平台的大多数C++编译器将提供至少float和double大致匹配IEEE 754 binary32和binary64规范(尽管您需要阅读每个单独编译器的文档以确保).
或者,您可以使用软件浮点实现或包装器,如FLIP,libgcc的soft-float,SoftFloat或STREFLOP.这些库有时仍会对根据C++标准不完全可移植的实现做出假设,因此使用风险由您自行承担.
| 归档时间: |
|
| 查看次数: |
857 次 |
| 最近记录: |