IEEE-754 float64 中最准确的 pi 近似值是多少?
fwiw Javascript 和 PHP 似乎都使用
3.141592653589793115997963468544185161590576171875
,这可能就是答案,我不知道。
是的,3.141592653589793115997963468544185161590576171875 是最接近 π 的 IEEE-754 二进制 641 数。它也可以写成十六进制浮点常数
0x1.921fb54442d18p1
。 (我手头保留了 0x3.243f6a8885a308d313198a2e03707344ap0L
,以便也能获得更宽格式的值。)C 标准要求 C 实现使用以 2 为基数的浮点格式来正确舍入十六进制浮点常量,但它并不要求对于十进制浮点常量,因此当您使用十六进制形式时,您可能更有可能获得正确的结果。
1 IEEE-754 2008 使用“binary64”作为标准 64 位基二格式。它也称为“双精度”。某些编程语言可能称其为
float64
或 Float64
。
@Eric 是正确的,IEEE-754-binary64 pi 大约比真实 pi 低 0.0000000000000001,而 IEEE-754-binary64 的下一个可能增量大约比真实 pi 高 0.0000000000000003,这两个零的数量相同,16 个零,并且3比1大,这意味着Eric+Javascript+PHP都可以。 PHP测试代码来证明这一点:
0.000000000000000000000001
是实际产生任何影响的最低增量。如果我的这个假设是错误的,设置一个更低的增量可能会显示不同的数字! (我没有足够的 cpu+耐心来舒适地测试任何较低的增量..)#!/usr/bin/env php
<?php
declare(strict_types=1);
function s($x) {
$ret = number_format($x, bcscale(), '.', '');
if(false!==strpos($ret, '.')) {
$ret = rtrim($ret, '0');
if(substr($ret, -1)==='.') {
$ret = substr($ret, 0, -1);
}
}
return $ret;
}
bcscale(100);
$realPi = "3.141592653589793238462";
$IEEE64Pi = "3.141592653589793115997";
$nextPossibleIncrement = "3.141592653589793560087";// $nextPossibleIncrement = "3.141592653589793560087173318606801331043243408203125"
$testIncrement = "0.000000000000000000000001";
// var_dump(bcsub($realPi, $IEEE64Pi));die(); // IEEE64Pi this much LOWER than realPi: 0.000000000000000122465
// var_dump(bcsub($realPi, $nextPossibleIncrement));die(); // nextPossibleIncrement this much HIGHER than realPi: 0.000000000000000321625
$test = $IEEE64Pi;
for(;;){
$d1 = (float)$test;
$new = bcadd($test, $testIncrement);
$d2 = (float)$new;
if($d1 !== $d2){
echo "Error: $test != $new\n";
echo "d1: ".s($d1)."\n";
echo "d2: ".s($d2)."\n";
break;
}
$test = $new;
//echo ".";
}
输出:
$ time php test.php
Error: 3.1415926535897933380425680000000000000000000000000000000000000000000000000000000000000000000000000000 != 3.1415926535897933380425690000000000000000000000000000000000000000000000000000000000000000000000000000
d1: 3.141592653589793115997963468544185161590576171875
d2: 3.141592653589793560087173318606801331043243408203125
real 6m33.130s
user 6m13.593s
sys 0m0.421s
pi - 3.141592653589793115997963468544185161590576171875 约为1.224646799147353177226065932275001058209749445923078164062862089986280348253421170679821480865132823066470938446095505 822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485 669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665 213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298 3367336244065664308602139... × 10^-16