Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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浮点除法和POW会给出错误的结果和意外的结果?_Php_C_Math_Division_Pow - Fatal编程技术网

为什么PHP浮点除法和POW会给出错误的结果和意外的结果?

为什么PHP浮点除法和POW会给出错误的结果和意外的结果?,php,c,math,division,pow,Php,C,Math,Division,Pow,有人知道为什么会发生这种情况,以及它是否可以修复吗。我比较了C和PHP的结果,但PHP给出了不同的结果 如果需要,我可以提供一些代码,但是以前有人经历过吗 PHP代码 $tempnum = 1.0e - 5 * -44954; // substr($line1,53,6); $bstar = $tempnum / pow(10.0, 3); $bstar gives me -0.00044954 in PHP but it should be -0.000450 $tempnum=1.0e-5

有人知道为什么会发生这种情况,以及它是否可以修复吗。我比较了C和PHP的结果,但PHP给出了不同的结果

如果需要,我可以提供一些代码,但是以前有人经历过吗

PHP代码

$tempnum = 1.0e - 5 * -44954; // substr($line1,53,6); $bstar = $tempnum / pow(10.0, 3); $bstar gives me -0.00044954 in PHP but it should be -0.000450 $tempnum=1.0e-5*-44954;//次级资源(第1、53、6行); $bstar=$tempnum/pow(10.0,3); $bstar在PHP中给出了-0.00044954,但它应该是-0.000450 C代码

double tempnum = 1.0e - 5 * -44954; double bstar = tempnum / pow(10.0, 3); printf bstar gives me -0.000450 双tempnum=1.0e-5*-44954; 双bstar=tempnum/pow(10.0,3); printf bstar给我-0.000450 感谢您的回复,但是PHP是如何得出这个结论的

$twopi = 6.28318530717958623; /* 2*Pi */ $xmnpda= 1440; //1.44E3 ; /* Minutes per day */ $temp = (($twopi/$xmnpda)/$xmnpda); $xndt2o = -0.000603; $xndt2o = $xndt2o * $temp; echo $xndt2o gives me -1.8256568188E-9 in PHP but in C it gives me -0.000000 $twopi=6.28318530717958623;/*2*Pi*/ $xmnpda=1440//1.44E3;/*每天分钟*/ $temp=($twopi/$xmnpda)/$xmnpda); $xndt2o=-0.000603; $xndt2o=$xndt2o*$temp; echo$xndt2o在PHP中为我提供了-1.8256568188E-9,但在C中为我提供了-0.000000
我不知道PHP中的所有内容。

有限精度浮点格式几乎总是稍微有点不准确,这些不准确可能会相互影响,并以意想不到的方式表现出来。通常情况下,结果并没有太大的错误,但唯一的问题是,你没有预料到不准确。要获得一般性解释,请阅读

也许与您的问题最相关的是:不应期望计算序列在不同平台上产生完全相同的结果,因为有许多因素可能导致执行不同的实际原始操作


对于您所看到的差异,一个更简单的解释可能是PHP代码只是在某处使用了32位浮点,因为差异显示在第6/7位小数点附近,就在32位浮点精度结束的地方。

如果告诉
printf
显示更多数字,则等效的C代码会给出相同的结果:

printf("%.8f\n", bstar);

非常感谢你们的帮助。我已经弄明白了

有时您需要在PHP中处理大数字。例如,有时32位标识符是不够的,您必须使用BIGINT 64位

我已经写过关于PHP中64位整数的混乱。但是,如果您使用的数字不能完全覆盖64位范围,则浮点数可以节省时间。诀窍在于PHP浮点实际上是双倍的,即双精度64位数字。它们的尾数有52位,最多可存储2^53-1的整数值。因此,如果您使用的是53位,则可以使用浮动

然而,有一个转换警告你应该注意

浮点到字符串的转换不能跨系统和PHP版本移植。因此,如果您正在处理以浮点形式存储的大量数字(特别是在32位系统上,其中32位int-overflow将隐式转换为float)并得到奇怪的结果,请记住字符串转换可能会让您失望。另一方面,sprintf()在修复数值处理中的PHP“微妙之处”时总是一个好朋友:它可以用来解决有符号和无符号int问题;它有助于浮点格式;永远是救世主


此问题上可能存在的重复和数百个其他变体您应该立即提供代码。告诉我们它们之间的区别,结果是什么,你期望什么。(另外:PHP是用C实现的,它可能会在引擎盖下使用C双精度。)我们还需要看看等效的C。我已经提供了我正在使用的代码。您还没有完全了解-C代码不会编译。格式字符串非常重要。@Carl,给我们看看你正在使用的printf。如果正在执行%.8f,则仅显示小数点后8位数字。计算的结果是*10^-9,这需要在printf格式字符串中使用更多的数字。@Carl:这只是再次显示精度。尝试
printf(“%g\n”)@Oli OK;它给了我-0.00060251,在我的计算之后,它给了我-1.82566e-009-0.00060251在php中是一样的,但正如你所看到的-1.82566e-009在php中是不一样的,在php中大约500行计算之后,当代码与C代码相同时,我的结果马上就出来了。@Oli Charlesworth我知道如何在C中使用它们,我使用printf的唯一原因是我可以将C结果与PHP进行比较。我希望我的代码在PHP而不是C中工作。因此,不管我如何告诉C打印精度,最终,PHP中的结果都是正确的。但是PHP和C中的计算是相同的,PHP是用C编写的,所以我希望得到相同的结果。@Carl:你的预期是错误的。这在浮点运算中经常发生。一定要看一看我链接到的那篇论文。我的经验法则:永远不要相信浮点运算;)所有浮点运算都不准确。这是将十进制数表示为二进制数的固有限制。这会影响所有编程语言(不仅仅是PHP和C),这只是它们在遇到这个限制之前可以给出多少位的问题。《浮点指南》的确是一本很好的读物。@azure_ardee:所有数字格式都不准确,因为它们都不能代表整数的全部,更不用说有理数或实数了。二进制浮点格式的问题在于,它们以意想不到的方式不准确,主要与二进制和十进制表示之间的差异有关。