首页 > 解决方案 > 大数的算术

问题描述

我一直在考虑如何为极端距离编程,例如在游戏 Hellion 中,轨道可能接近数百万公里的范围。然而,有一个常见的故障,即您离正在运行的物体越远,运动就会变得非常不稳定。我对为什么会这样的猜测可能是错误的,但我最好的猜测是,这归结于那个距离的精度损失。

作为一个小练习,我一直在思考解决这个问题的方法,而我目前拥有的是一个非常基本的单位分段距离系统。

class Distance
{
    public const MAX_AU = 63018.867924528;
    public const MAX_MM = 149598000000000;

    private $ly = 0;
    private $au = 0;
    private $mm = 0;

    public function add(Distance $add): Distance
    {
        $distance = new Distance();
        $distance->mm = $this->mm + $add->mm;

        if ($distance->mm > self::MAX_MM) {
            $distance->mm-= self::self::MAX_MM;
            $distance->au++;
        }

        $distance->au+= $this->au + $add->au;

        if ($distance->au > self::MAX_AU) {
            $distance->au-= self::self::MAX_AU;
            $distance->ly++;
        }

        $distance->ly+= $this->ly + $add->ly;

        return $distance;
    }
}

我输入了加法,好像是手写的。我不想使用任意精度,因为它对于计算玩家通常会与之交互的较小距离来说太极端了。

我的问题是;这是这样的事情通常是怎么做的?如果没有,有人可以解释一下这有什么问题(例如效率低下),以及如何做得更好?

谢谢


PS。我知道在游戏的上下文中,这通常是用子网格来处理的,但是为了模拟轨道上的物体如何分开,这就是它的用途。

标签: phpmathlargenumber

解决方案


您可以使用BCMath函数。BCMath 支持任何大小和精度的数字。

例子:

$mm = "149598000000000";
$au = "63018.867924528";
$sum = bcadd($mm,$au,10);
echo $sum;
//149598000063018.8679245280

推荐阅读