我有一个场景,我正在尝试在AIX和Linux上执行复杂的应用程序。
在执行期间,代码使用内部函数sqrt()进行计算,但在两台机器上获得的结果都不同。
有谁知道这种行为的原因?无论如何要克服这个问题吗?
P.S
两台机器上的某些值相同,但大部分都不同。
答案 0 :(得分:4)
遵循IEEE 754规范的处理器必须返回平方根的精确结果(或者在无法精确表示时正确舍入)。对于相同的输入值,浮点格式和舍入模式,不同的IEEE 754兼容处理器必须返回相同的结果。不允许任何变化。看到不同结果的可能原因:
您是否比较了二进制输出以消除打印格式错误或差异的可能性?
目前大多数处理器都支持IEEE 754浮点。不保证IEEE 754准确性的示例是使用OpenCL native_sqrt函数。 OpenCL定义了native_sqrt(除了IEEE 754兼容的sqrt之外),因此如果需要,可以交换速度以保证准确性。
IEEE 754 sqrt实施中的错误今天并不常见。 IEEE 754 sqrt函数的一个困难的情况是当舍入模式设置为最接近并且实际结果非常接近两个浮点表示之间的中间点时。可以在William Kahan撰写的论文How to Test Whether SQRT is Rounded Correctly中找到生成这些困难的平方根参数的方法。
答案 1 :(得分:2)
两台计算机上的硬件数值表示或两个编译器的sqrt函数使用的算法可能略有不同。有限精度算法与实数的算法不同,应该预期计算中的细微差别。要判断差异是否异常,您应该说明您正在使用的数字类型(由ChuckCottrill提出)并举例说明。有什么相对差异。对于阶数为1的值,1E-9是单精度浮点的预期差值。
答案 2 :(得分:1)
检查每个cpu可用的浮点格式。您使用的是单精度还是双精度浮点?如果需要可比较/类似的答案,则需要在两台机器上使用具有类似精度的浮点格式。
浮点是近似值。单精度浮点仅使用24位(包括符号位)作为尾数,其他8位用于指数。这允许大约8位精度。双精度浮点使用53位,允许更高的精度。
缺少关于两个systesm上不同浮点数的二进制值的详细信息,以及这些值的打印表示,您有舍入或表示差异。