JavaScript中更高的精度

时间:2020-08-04 17:00:37

标签: javascript mandelbrot

我正在尝试使用JavaScript进行更高精度的计算,以便能够在Mandlebrot集上进行更多放大。 (由于精度低,经过一定程度的缩放后,结果会变成“像素化”)

我看过this question,所以我尝试使用BigNumber之类的库,但是它的速度慢得令人无法接受。 我已经尝试了一段时间,并且我认为唯一的方法是使用慢速库。

有更快的图书馆吗?

还有其他方法可以计算精度更高的数字吗?

还有其他方法可以放大Mandlebrot集吗?

可能不需要添加此代码,但这是我用来检查Mandlebrot集中是否存在点的功能。

function mandelbrot(x, y, it) {
    var z = [0, 0]
    var c1 = [x, y]
    
    for (var i = 0; i < it; i++) {
        z = [z[0]*z[0] - z[1]*z[1] + c1[0], 2*z[0]*z[1] + c1[1]]
        if (Math.abs(z[0]) > 2, Math.abs(z[1]) > 2) {
            break
        }
    }
    return i
}

1 个答案:

答案 0 :(得分:2)

关键不是JavaScript数字的原始数字精度(尽管它当然会产生影响),而是基本的Mandelbrot“转义”测试的工作方式,特别是阈值迭代计数。要计算复杂平面中的一个点是否在集合中或不在集合中,您需要反复遍历该点的公式(我不太记得,也不想看起来像在查找该点),直到该点明显为止差异(公式从复杂平面的原点“逃逸”很多)或在达到迭代阈值之前没有偏离。

在渲染围绕复杂平面原点(大部分距离原点的所有方向上约2个单位)的集合的视图时,迭代阈值可以低至500,以得到很好的渲染效果。在一台现代计算机上以合理的放大倍数设置了整个系统。但是,放大时,迭代阈值需要与复杂平面上“窗口”的大小成反比增加。如果不正确,则“转义”测试无法以足够的精度进行工作,无法以较高的放大倍率描绘出精细的细节。

我在JavaScript实现中使用的公式是

maxIterations = 400 * Math.log(1/dz0)

其中dz0是(任意)窗口在平面上的 width 。当人们放大集合的视图时({,有趣的是集合的“边缘”),dz0变得很小,因此迭代阈值上升到数千。

当然,对于执行“转义”的点(即,不属于Mandelbrot集的 的点)的迭代计数可以用作一种“距离”度量。在几次迭代中转义的点显然并不“接近”集合,而仅在2000次迭代后转义的点更接近。可以在可视化中以各种方式使用距离质量,以提供颜色值(通用)或z轴值(如果将集合渲染为3D视图(该集合作为一种“ mesa”)三个尺寸,并且边框是侧面的垂直“悬崖”。