我知道浮点计算存在准确性问题,并且有很多问题可以解释原因.我的问题是,如果我运行两次相同的计算,我是否可以始终依赖它来产生相同的结果?哪些因素可能会影响这个?
我有一个简单的物理模拟,并希望记录会话,以便他们可以重播.如果可以依赖计算,那么我只需要记录初始状态加上任何用户输入,我应该始终能够完全重现最终状态.如果计算不准确,那么在开始时错误可能会在模拟结束时产生巨大影响.
我目前在Silverlight工作,但有兴趣知道这个问题是否可以回答一般.
更新: 初始答案表明是,但显然这并不完全清楚,如所选答案的评论中所述.看起来我将不得不做一些测试,看看会发生什么.
假设您正在编写一个执行大量浮点运算的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位浮点数吗?
我使用jtransforms库在matlab和java中做了fft,但结果略有不同.
Matlab results:
-0.0530528652679544
-0.00775535711930750 + 0.0281791646147104i
-0.0304104457750988 - 0.209776156064443i
0.266945753193636 + 0.200338044445226i
Jtransforms results:
-0.05305448436232618
-0.007755593801247046 + 0.028180024600812384
-0.03041137385657606 -0.20978255812004887
0.26695389998013486 + 0.20034415846373468
Run Code Online (Sandbox Code Playgroud)
结果是不同的还是Matlab只是四舍五入?