Более высокая точность JavaScript - PullRequest
2 голосов
/ 04 августа 2020

Я пытаюсь вычислить с более высокой точностью числа в 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
}

1 Ответ

2 голосов
/ 04 августа 2020

Ключ не столько в точности c необработанных чисел JavaScript чисел (хотя это, конечно, имеет свои последствия), а в том, как работает базовый c тест Мандельброта, в частности, пороговая итерация подсчитывает. Чтобы вычислить, находится ли точка на комплексной плоскости в наборе или вне набора, вы повторяете формулу (которую я точно не помню и не хочу смотреть вверх) для точки снова и снова, пока точка не станет очевидной. расходится (формула «ускользает» от начала комплексной плоскости на много) или не выходит до достижения порога итерации.

Порог итерации при рендеринге представления множества, которое покрывает большую его часть вокруг начала комплексной плоскости (около 2 единиц во всех направлениях от начала координат) может составлять всего 500, чтобы получить довольно хороший рендеринг всего набора при разумном увеличении на современном компьютере. Однако при увеличении масштаба порог итерации должен увеличиваться обратно пропорционально размеру «окна» на комплексной плоскости. Если это не так, значит, тест «побега» не работает с достаточной точностью для выделения мелких деталей при более высоком увеличении.

Формула, которую я использовал в своей реализации JavaScript, -

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

, где dz0 - (произвольно) ширина окна на плоскости. При увеличении масштаба изображения набора (ну, «края» набора, где все интересно), dz0 становится довольно маленьким, поэтому порог итерации достигает тысяч.

Итерация счетчик, конечно, для точек, которые «ускользают» (то есть точек, которые не являются частью набора Мандельброта), может использоваться как своего рода измерение «расстояния». Точка, которая ускользает в течение нескольких итераций, явно не «близка» к множеству, тогда как точка, которая ускользает только после 2000 итераций, намного ближе. Это качество расстояния можно использовать по-разному в визуализациях, либо для предоставления значения цвета (общее), либо, возможно, для значения оси Z, если набор визуализируется как 3D-вид (с набором как своего рода «меза» в в трех измерениях и границами в виде вертикального «обрыва» по бокам).

...