javascript - 更高的 JavaScript 精度

标签 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
}

最佳答案

关键不在于 JavaScript 数字的原始数字精度(尽管这当然有其影响),而是基本 Mandelbrot“逃逸”测试的工作方式,特别是阈值迭代计数。要计算复平面中的一个点是在集合中还是在集合外,您可以一遍又一遍地迭代该点的公式(我不完全记得并且不想查找)直到该点明显发散(公式从复平面的原点“逃脱”了很多)或在达到迭代阈值之前不发散。
在渲染围绕复平面原点(从原点向各个方向大约 2 个单位)覆盖大部分 View 的集合 View 时,迭代阈值可以低至 500,以便在现代计算机上的合理放大倍数。但是,当您放大时,迭代阈值需要与复平面上“窗口”的大小成反比增加。如果不是,那么“逃逸”测试就不能以足够的精度在更高的放大倍数下描绘出精细的细节。
我在 JavaScript 实现中使用的公式是

maxIterations = 400 * Math.log(1/dz0)
哪里dz0是(任意)窗口在平面上的宽度。当一个人放大到集合的 View (好吧,集合的“边缘”,事情有趣的地方),dz0变得非常小,因此迭代阈值上升到数千。
当然,对于“逃逸”的点(即不属于 Mandelbrot 集的点)的迭代计数可以用作一种“距离”测量。在几次迭代内逃逸的点显然不是“接近”集合,而仅在 2000 次迭代后逃逸的点则更接近。这种距离质量可以在可视化中以各种方式使用,如果集合被渲染为 3D View (将集合作为一种“台面”在三个维度,边界是侧面的垂直“悬崖”)。

关于javascript - 更高的 JavaScript 精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63251702/

相关文章:

javascript - 如何在 Bootstrap 日期选择器上调用更改事件?

java - 标准化迭代计数不起作用。我究竟做错了什么?

javascript 事件被应用于错误的元素

Javascript load vs ready vs domready vs DOMContentLoaded 事件

Javascript document.write 循环问题

code-golf - Code Golf : the Mandelbrot set

c++ - 大 O 表示法的 Mandelbrot 集的时间复杂度

algorithm - 在我现有的 Mandelbrot 生成器中实现平滑颜色算法

c - C 中的 bmp 段错误

javascript - Node.js 控制台中的 `undefined` 是什么意思?