Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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
Php 所有系统都是';什么是浮点运算?_Php_Excel_Math_Floating Point - Fatal编程技术网

Php 所有系统都是';什么是浮点运算?

Php 所有系统都是';什么是浮点运算?,php,excel,math,floating-point,Php,Excel,Math,Floating Point,我们正在用PHP制作这个web应用程序,在报告中工作时,我们有Excel文件来比较我们的结果,以确保我们的编码执行正确的操作 现在,由于浮点运算,我们遇到了一些差异。我们在做相同的除法和乘法,得到的数字略有不同,加起来就有了显著的差异 我的问题是,如果Excel将其浮点运算委托给CPU,而PHP也依赖CPU进行操作。还是每个应用程序都实现了自己的一套数学算法?大多数系统都实现了这些算法,这些算法虽然不是很好,但对于大多数目的来说已经足够好了。如果您想获得更高的精度,请查看以下内容。在特定计算机上

我们正在用PHP制作这个web应用程序,在报告中工作时,我们有Excel文件来比较我们的结果,以确保我们的编码执行正确的操作

现在,由于浮点运算,我们遇到了一些差异。我们在做相同的除法和乘法,得到的数字略有不同,加起来就有了显著的差异


我的问题是,如果Excel将其浮点运算委托给CPU,而PHP也依赖CPU进行操作。还是每个应用程序都实现了自己的一套数学算法?

大多数系统都实现了这些算法,这些算法虽然不是很好,但对于大多数目的来说已经足够好了。如果您想获得更高的精度,请查看以下内容。

在特定计算机上使用本机双精度类型来执行其计算。我不确定PHP到底在使用什么

但是,应该注意的是,即使在基于x86的机器上复制浮点数,也可能会改变它的值。浮点存储在80位宽的寄存器中。它们以64位宽的块存储在内存中。因此,假设Excel和PHP都在基于x86的机器上运行,即使使用类似的计算,也可以得到不同的值。特别是在浮点类型支持的范围的极端情况下

最后,Excel使用的
double
和PHP代码中的
float
之间有一个明显的区别。确保这些值不匹配,因为
float
s的精度要低得多


编辑:也忘了这一点——如果PHP或Excel(更可能是Excel)使用SSE扩展,则输出会有所不同,因为它们的浮点操作是在64位而不是80位的双精度上操作。

处理PHP浮点计算时要非常小心。PHP是一种灵活的脚本语言,但它的灵活性和松散的类型可能会在类型之间转换或读取数据时造成危险


我强烈建议您阅读PHP手册中的。有一个名为的模块,用于任意精度的计算,根据您所做的工作,您可能希望利用它。

对于更长但不是任意精度的计算,请尝试。

您的浮点表示什么?钱?坏主意:使用定点,而不是浮点数。@duffymo:谢谢你的修正:)也许我不应该在做其他事情时回答这么多问题。事实上,我认为PHP更可能使用SSE2进行双重算术。我预计Excel会有一个可怕的遗留问题,即与旧版本的bug兼容的强制bug,而PHP很可能没有。@Stephen Canon:SSE的收益只有在计算可以通过4种方式并行时才可能实现。由于PHP没有并行化原语,我认为实现SSE甚至不会有什么好处。当然,我可能错了110%。那不是真的;SSE有标量运算和矢量运算,即使没有矢量化,它们通常也比使用x87 FPU快。@Stephen Canon:当你有大量数据要处理时,是的。但将事情转变为苏格兰和南方能源公司模式是有代价的。无论如何,整个讨论都不相关。哪一个程序实现了什么并不重要——只要它们做的事情不同,观察到的行为就会有所不同。这就是问题所在。为什么要投反对票?我的回答是对伊格纳西奥·巴斯克斯·艾布拉姆斯回答的回答;也许这应该是一个评论。