php - 大数的算术
问题描述
我一直在考虑如何为极端距离编程,例如在游戏 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。我知道在游戏的上下文中,这通常是用子网格来处理的,但是为了模拟轨道上的物体如何分开,这就是它的用途。
解决方案
您可以使用BCMath函数。BCMath 支持任何大小和精度的数字。
例子:
$mm = "149598000000000";
$au = "63018.867924528";
$sum = bcadd($mm,$au,10);
echo $sum;
//149598000063018.8679245280
推荐阅读
- mysql - 在 varchar 列上使用 ORDER BY 时如何优化查询?
- javascript - Webpack + Discord.js + 电子
- reactjs - 更漂亮的错误`␍⏎····mapStateToProps,␍⏎····mapDispatchToProps,␍⏎··`与`mapStateToProps,·mapDispatchToProps`
- javascript - 从箭头函数返回键值对
- c# - 在 C# 的字符串列表中使用什么来代替 Concat
- javascript - 承诺/回调混合函数
- python - 当我有太多点时,matplotlib 中有什么方法可以制作虚线吗?
- javascript - 尝试将产品添加到购物车时,我在控制台中收到“未定义”消息
- python - 如何更改 WindroseAxes 中的轴标签?
- angular - 为什么组件 SCSS 不适用 Ionic