在IEEE-754 float64中,最精确的π近似可能是什么?
似乎Javascript和PHP都使用3.141592653589793115997963468544185161590576171875,这可能是答案,我不知道。
发布于 2022-07-07 20:41:36
@Eric是正确的,IEEE-754-binary64pi大约比实pi低0.0000000000000001,下一个可能的增量iee-754-binary64大约比实pi高0.0000000000000003,这两个都是相同的零数,16个零,3大于1,这意味着Eric+Javascript+PHP是好的。PHP测试代码来证明这一点:
0.000000000000000000000001是实际产生影响的最低增量。如果我在这个假设中错了,设置一个更低的增量可能会显示一个不同的数字!(我没有足够的cpu+patience来轻松地测试任何较低的增量)#!/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.421shttps://stackoverflow.com/questions/72365104
复制相似问题