Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在不同机器之间使用浮动/双精度时,我应该知道什么?_C++_Visual Studio 2008_Floating Point_Floating Accuracy - Fatal编程技术网

C++ 在不同机器之间使用浮动/双精度时,我应该知道什么?

C++ 在不同机器之间使用浮动/双精度时,我应该知道什么?,c++,visual-studio-2008,floating-point,floating-accuracy,C++,Visual Studio 2008,Floating Point,Floating Accuracy,我听说不同CPU上的浮点/双浮点存在许多问题 如果我想制作一个所有东西都使用浮点数的游戏,我如何确保每台机器上的浮点数计算完全相同,以便我的模拟在每台机器上看起来完全相同 我还担心写入/读取文件或将浮点值发送/接收到不同的计算机。必须进行哪些转换(如果有) 我需要100%确定我的浮点值的计算结果完全相同,因为即使计算结果稍有不同,也会导致完全不同的未来。这是可能的吗?< P>每个程序员都应该知道:< P>标准C++没有规定任何关于范围限制以外的浮点类型的细节,也可能是一些数学函数(如正弦和指数)

我听说不同CPU上的浮点/双浮点存在许多问题

如果我想制作一个所有东西都使用浮点数的游戏,我如何确保每台机器上的浮点数计算完全相同,以便我的模拟在每台机器上看起来完全相同

我还担心写入/读取文件或将浮点值发送/接收到不同的计算机。必须进行哪些转换(如果有)


我需要100%确定我的浮点值的计算结果完全相同,因为即使计算结果稍有不同,也会导致完全不同的未来。这是可能的吗?

< P>每个程序员都应该知道:

< P>标准C++没有规定任何关于范围限制以外的浮点类型的细节,也可能是一些数学函数(如正弦和指数)必须是正确的,达到一定的精度。 除此之外,在这种普遍性水平上,你真的没有什么可以依赖的了

也就是说,很有可能您实际上不需要在每个平台上进行二进制相同的计算,并且
float
double
类型的精度和准确性保证实际上足以用于模拟目的

请注意,在修改子表达式的求值顺序时,您甚至无法在自己的程序中生成代数表达式的可靠结果,因此要求所需的再现性可能有点不切实际。如果您需要真正的浮点精度和精度保证,您最好使用具有正确舍入的任意精度库,例如-但这对于游戏来说似乎不现实


序列化浮动是一个完全不同的故事,您必须对目标平台使用的表示有一些了解。如果所有平台实际上都使用32或64位大小的IEEE 754浮点,那么您可能只需要直接交换二进制表示(模endianness)。如果您有其他平台,您将不得不想出自己的序列化方案。

看看这篇文章,您可能会发现这篇文章很有帮助:如果计算中存在细微差异,那么浮点可能不适合开始,考虑不动点/或有理数或其他基于整数的ARITMETICE浮动不是用随机的随机数来计算的。如果a和b具有相同的值,a*b将是相同的。因此,简而言之:如果我想在(网络)游戏中使用浮点,我必须编写自己的浮点数据类型,以确保它在所有机器上都能完全相同地工作,同时也降低了计算效率?@Rookie:如果你真的想让代码在任何平台上工作的话(不仅仅是每个平台),那么是的,但实际上,您可能不会对自己造成太大的惩罚,只需假设您的所有目标平台都使用IEEE浮点。IEEE浮点在每个CPU上的工作方式都完全相同?即使其intel CPU()浮点表示是IEEE标准固定的,是的。但浮点运算不一定需要,至少在更高级别的算法和库函数中是这样。啊,好吧,所以…我无法确保我的模拟在不同的CPU上会有相同的最终结果…我在做数百万的加法和除法,如果有som计算结果的不同,最终结果将不再相同,这对我的应用程序来说是至关重要的。那么,任何游戏如何克服这个问题呢?它们是否只是时不时地对结果进行取整,以避免计算中可能存在的差异?两台机器在计算中可能存在的最大差异是什么?我可以用它来确定我应该将值四舍五入的区间。