假设您正在编写一个执行大量浮点运算的C++应用程序.假设这个应用程序需要在合理范围的硬件和操作系统平台上可移植(例如32位和64位硬件,Windows和Linux都是32位和64位版本......).
您如何确保所有平台上的浮点算法都相同?例如,如何确保所有平台上的32位浮点值真的是32位?
对于整数,我们有stdint.h但似乎没有浮点等价物.
[编辑]
我得到了非常有趣的答案,但我想为这个问题增加一些精确度.
对于整数,我可以写:
#include <stdint>
[...]
int32_t myInt;
Run Code Online (Sandbox Code Playgroud)
并确保无论我在哪个(C99兼容)平台上,myInt都是32位整数.
如果我写:
double myDouble;
float myFloat;
Run Code Online (Sandbox Code Playgroud)
我确定这会在所有平台上分别编译为64位和32位浮点数吗?
我们正在使用C语言中的数字例程库.我们还不确定是否可以使用单精度(float)或double(double),因此我们将类型定义SP为别名,直到我们决定:
typedef float SP;
Run Code Online (Sandbox Code Playgroud)
当我们运行我们的单元测试时,它们都会通过我的机器(一个64位的Ubuntu),但它们在我的同事(一个错误地安装在64位机器上的32位Ubuntu)上失败了.
使用Git的bisect命令,我们发现确切的差异开始在他的机器和我的机器之间产生不同的结果:
-typedef double SP;
+typedef float SP;
Run Code Online (Sandbox Code Playgroud)
换句话说,从双精度到单精度会在我们的机器上产生数值上不同的结果(在最坏情况下约为1e-3相对差异).
我们相当肯定,我们永远不会将无符号的整数与负数签名的整数进行比较.
为什么数字例程库会在32位操作系统和64位系统上产生不同的结果?
澄清
我担心我可能不够清楚:我们有2f3f671使用双精度的Git提交,并且单元测试在两台机器上同样通过.然后我们有git的承诺46f2ba,我们改为单精度,这里的测试仍然通过64位的计算机上,但不能在32位机器上.