首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在IEEE-754 float64中π的最精确逼近?

在IEEE-754 float64中π的最精确逼近?
EN

Stack Overflow用户
提问于 2022-05-24 14:54:31
回答 1查看 224关注 0票数 -1

在IEEE-754 float64中,最精确的π近似可能是什么?

似乎Javascript和PHP都使用3.141592653589793115997963468544185161590576171875,这可能是答案,我不知道。

EN

回答 1

Stack Overflow用户

发布于 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测试代码来证明这一点:

  • 警告,在我的笔记本电脑(i7-8565U,2018年的中档笔记本电脑cpu)上运行大约需要7分钟的时间,
  • 警告:没有同行评审,可能是错误的
  • 警告:我认为0.000000000000000000000001是实际产生影响的最低增量。如果我在这个假设中错了,设置一个更低的增量可能会显示一个不同的数字!(我没有足够的cpu+patience来轻松地测试任何较低的增量)

代码语言:javascript
复制
#!/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 ".";
}

产出:

代码语言:javascript
复制
$ time php test.php
Error: 3.1415926535897933380425680000000000000000000000000000000000000000000000000000000000000000000000000000 != 3.1415926535897933380425690000000000000000000000000000000000000000000000000000000000000000000000000000
d1: 3.141592653589793115997963468544185161590576171875
d2: 3.141592653589793560087173318606801331043243408203125

real    6m33.130s
user    6m13.593s
sys     0m0.421s
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72365104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档