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";