Php pi的不同值?
那么Php pi的不同值?,php,precision,pi,Php,Precision,Pi,那么pi()的精度值是什么呢?好像完全不对劲了。是的,我知道π是无理的,但至少对于100个有效数字,它应该是准确的吗 有人能确认这个问题吗?有没有可能解释一下为什么在php中16位数字之后会出错?问题是M_PI的值(与PI()返回的值相同)是硬编码的 从文件中: 更改精度不会更改已定义的常量值。此外,通常的“浮点数/双数是如何存储的”仍然适用。在bcmath extensions手册页面中,显示了以下内容: #ifndef M_PI #define M_PI 3.141592
pi()
的精度值是什么呢?好像完全不对劲了。是的,我知道π是无理的,但至少对于100个有效数字,它应该是准确的吗
有人能确认这个问题吗?有没有可能解释一下为什么在php中16位数字之后会出错?问题是M_PI
的值(与PI()
返回的值相同)是硬编码的
从文件中:
更改精度不会更改已定义的常量值。此外,通常的“浮点数/双数是如何存储的”仍然适用。在bcmath extensions手册页面中,显示了以下内容:
#ifndef M_PI
#define M_PI 3.14159265358979323846 /* pi */
#endif
//采用高斯-勒让德算法的bcpi函数
//徐超(Mgccl)
函数bcpi($精度){
$n=0;
$limit=ceil(log($precision)/log(2))-1;
比例尺(精度+6美元);
$a=1;
$b=bcdiv(1,bcsqrt(2));
$t=1/4;
$p=1;
而($n<$limit){
$x=bcdiv(bcadd($a,$b),2);
$y=bcsqrt(bcmul($a,$b));
$t=bcsub($t,bcmul($p,bcpow(bcsub($a,$x),2));
$a=$x;
$b=$y;
$p=bcmul(2$p);
++$n;
}
返回bcdiv(bcpow(bcadd($a,$b),2),bcmul(4,$t),$precision);
}
回波bcpi(64);
回声“
3.1415926535897932384626433832795028841971693993751058209749445923”;
因此,似乎ini_集('precision',64);对常规的php数学函数(>15)没有任何建设性的作用,但是bcmath扩展完全忽略了该设置
因此,要以大于等于16的精度工作,请使用bcmath扩展
否则ini_设置最多可工作15分钟
@Progman的回答是float/double存储规则仍然适用——这意味着在15个小数点上有一个上限(即使php将所有float存储为double)
echo“3.14159265358979323846264338327950
”代码>->
在那里看起来很糟糕。你不这么认为吗?也许是因为。。无法确认,我没有用PHPW编码如果你需要精确到100个小数点,你到底在用PHP吗?@Tigger,所以在任何数字中,数字应该四舍五入…但它并不是在16位之后四舍五入,而是在16位之后四舍五入是完全错误的…我要强调的是如何确保在16位时进行四舍五入,而不是在20位时得到一个完全错误的值。我不需要精确到100个小数点,我只是指出了一个偏离的点,而不是四舍五入的问题。
3.1415926535898
3.141592653589793115997963468544185161590576171875
3.14159265358979323846264338327950
#ifndef M_PI
#define M_PI 3.14159265358979323846 /* pi */
#endif
//bcpi function with Gauss-Legendre algorithm
//by Chao Xu (Mgccl)
function bcpi($precision){
$n=0;
$limit = ceil(log($precision)/log(2))-1;
bcscale($precision+6);
$a = 1;
$b = bcdiv(1,bcsqrt(2));
$t = 1/4;
$p = 1;
while($n < $limit){
$x = bcdiv(bcadd($a,$b),2);
$y = bcsqrt(bcmul($a, $b));
$t = bcsub($t, bcmul($p,bcpow(bcsub($a,$x),2)));
$a = $x;
$b = $y;
$p = bcmul(2,$p);
++$n;
}
return bcdiv(bcpow(bcadd($a, $b),2),bcmul(4,$t),$precision);
}
echo bcpi(64);
echo "<br>3.1415926535897932384626433832795028841971693993751058209749445923";