Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的更高精度_Javascript_Mandelbrot - Fatal编程技术网

JavaScript中的更高精度

JavaScript中的更高精度,javascript,mandelbrot,Javascript,Mandelbrot,我试图用JavaScript计算更高精度的数字,以便能够放大Mandlebrot集合。 (经过一定程度的缩放后,由于精度较低,结果会变得“像素化”) 我已经看过了,所以我试着使用像BigNumber这样的库,但是速度太慢了。 我已经试着弄明白这一点有一段时间了,我认为唯一的方法是使用一个缓慢的库 有更快的图书馆吗 有没有其他更高精度的计算方法 还有其他方法可以放大Mandlebrot集合吗 可能没有必要添加此代码,但这是我用来检查Mandlebrot集中是否有点的函数 function mand

我试图用JavaScript计算更高精度的数字,以便能够放大Mandlebrot集合。 (经过一定程度的缩放后,由于精度较低,结果会变得“像素化”)

我已经看过了,所以我试着使用像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
}
函数mandelbrot(x,y,it){
var z=[0,0]
变量c1=[x,y]
for(var i=0;i2,数学abs(z[1])>2){
打破
}
}
返回i
}

关键不在于JavaScript数字的原始数字精度(尽管这当然有其影响),而是基本Mandelbrot“escape”测试的工作方式,特别是阈值迭代计数。要计算复平面中的一个点是在集合中还是在集合外,您需要反复迭代该点的公式(我记不清,也不想查找),直到该点明显偏离(公式从复平面原点“逃逸”了很多)或者在达到迭代阈值之前没有

在复杂平面原点周围(从原点到各个方向大约2个单位)渲染集合视图时,迭代阈值可以低至500,以便在现代计算机上以合理的放大率获得整个集合的相当好的渲染。但是,放大时,迭代阈值需要与复杂平面上“窗口”的大小成反比增加。如果没有,那么“逃逸”测试就不能以足够的精度在更高的放大率下描绘出精细的细节

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

maxIterations = 400 * Math.log(1/dz0)
其中
dz0
是(任意)窗口在平面上的宽度。当一个人放大集合的视图时(集合的“边缘”,这里有有趣的东西),
dz0
变得非常小,因此迭代阈值达到数千


当然,对于“转义”的点(即不属于Mandelbrot集的点)的迭代计数可以用作一种“距离”测量。在几次迭代中逃逸的点显然不“接近”集合,而仅在2000次迭代后逃逸的点更接近集合。这种距离质量可以在可视化中以各种方式使用,可以提供颜色值(通用),也可以提供z轴值(如果该集渲染为三维视图(该集在三维中为一种“台面”,边界为侧面的垂直“悬崖”)。

您可以尝试其他库,但在浏览器中,您仅限于浏览器实现,例如,没有FFI可以实现真正快速的功能。当您“放大”复杂平面上越来越小的区域时,您必须增加迭代限制。单击并拖动到zoom@Pointy我知道我必须增加分辨率,但我遇到的问题是,经过一点缩放后,它会变得像素化,与这里的情况完全相同:在集合的完整大小下,原点周围大约2个单位,500次迭代就足够了。在越来越小的区域,你需要增加数千次最大迭代次数。@DaveNewton我们完全滥用了评论部分,但如果DEC Alpha不是像DEC这样混乱的公司的财产,它可能会非常成功。对不起,但我不认为这实际上解决了问题-OP特别问了他的图像像素化的问题,而不是低迭代限制导致的细节缺失。除此之外,你提到的公式充其量只是一个粗略的近似值;根据放大的位置,所需的迭代次数变化很大,因此在某些地方这会严重低估迭代次数,而在其他地方则会高估迭代次数。@PeaBrain是的,这是真的;显然,任何选择迭代计数的公式都可以被替代。在实践方面(我的意思是,整个事情都是关于制作漂亮的图像),我发现这已经足够好了。是的,当浮点范围内的“空间”用完时,情况看起来很糟糕,但是没有什么可以做的。