IEEE-754 float64 中最准确的 pi 近似值?

问题描述 投票:0回答:3

IEEE-754 float64 中最准确的 pi 近似值是多少?

fwiw Javascript 和 PHP 似乎都使用

3.141592653589793115997963468544185161590576171875
,这可能就是答案,我不知道。

ieee-754 pi
3个回答
3
投票

是的,3.141592653589793115997963468544185161590576171875 是最接近 π 的 IEEE-754 二进制 641 数。它也可以写成十六进制浮点常数

0x1.921fb54442d18p1
。 (我手头保留了
0x3.243f6a8885a308d313198a2e03707344ap0L
,以便也能获得更宽格式的值。)C 标准要求 C 实现使用以 2 为基数的浮点格式来正确舍入十六进制浮点常量,但它并不要求对于十进制浮点常量,因此当您使用十六进制形式时,您可能更有可能获得正确的结果。

脚注

1 IEEE-754 2008 使用“binary64”作为标准 64 位基二格式。它也称为“双精度”。某些编程语言可能称其为

float64
Float64


0
投票

@Eric 是正确的,IEEE-754-binary64 pi 大约比真实 pi 低 0.0000000000000001,而 IEEE-754-binary64 的下一个可能增量大约比真实 pi 高 0.0000000000000003,这两个零的数量相同,16 个零,并且3比1大,这意味着Eric+Javascript+PHP都可以。 PHP测试代码来证明这一点:

  • 警告,在我的笔记本电脑(i7-8565U,2018 年中档笔记本电脑 CPU)上运行大约需要 7 分钟
  • 警告:未经同行评审,可能有问题
  • 警告:我假设
    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

-1
投票

pi - 3.141592653589793115997963468544185161590576171875 约为1.224646799147353177226065932275001058209749445923078164062862089986280348253421170679821480865132823066470938446095505 822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485 669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665 213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298 3367336244065664308602139... × 10^-16

© www.soinside.com 2019 - 2024. All rights reserved.