Я столкнулся с проблемой, связанной с числовой точностью значений, отображаемых на моих диаграммах. Одна из моих рабочих диаграмм показана в этом прототипе и предназначена для отображения с максимально возможной точностью данных из списка, содержащего результаты вычислений 3n + 1.
Однако я столкнулся с нежелательной проблемой: ECharts не поддерживает BigInt, и поскольку я не очень знаком с компиляцией или подобными низкоуровневыми решениями, я временно прибегнул к использованию логарифмов (log10).
В конце концов я пришел к выводу, что необходимы две диаграммы:
математически точная диаграмма и
логарифмическая диаграмма.
Я нашел этот сайт — Collatz Graph — где математически точная диаграмма была отображена на (хотя, к сожалению, она ломается, когда числа становятся чрезвычайно большими). Это примерно тот результат, которого я хотел бы достичь с помощью ECharts.
Я обратился за помощью к ChatGPT, Qwen и Claude, но даже они не смогли решить мою проблему, которая, по общему признанию, весьма нестандартна.
Чтобы наглядно продемонстрировать проблему, я опубликовал CodePen, содержащий код, отвечающий за создание диаграммы (пример ошибки диаграммы Codepen), но я очень недоволен результатом.
Я довольно плохо создаю диаграммы, поэтому прошу помощи у профессионалов.
Код:
Код: Выделить всё
const inp = document.getElementById('input');
const runBtn = document.querySelector('.play');
const chartEl = document.getElementById('chart');
chartEl.style.width = '500px';
chartEl.style.height = '300px';
/* ===== input filter (NUMBERS ONLY (so you can input infinite amount of nums)) ===== */
inp.addEventListener('beforeinput', e => {
if (e.data && !/^[0-9]+$/.test(e.data)) {
e.preventDefault();
}
});
/* ===== Collatz calculations BigInt ONLY ===== */
function collatzBigInt(n) {
const spisok = [];
if (n === 0n) return spisok;
while (true) {
spisok.push(n);
if (n === 1n) break;
if (n % 2n === 0n) {
n = n / 2n;
} else {
n = n * 3n + 1n;
}
if (spisok.length > 20000) break;
}
return spisok;
};
/* ===== graph compiler (BigInt -> Number) ===== */
function graphLogSize(value) {
const s = value.toString();
const k = 15;
if (s.length
Подробнее здесь: [url]https://stackoverflow.com/questions/79889264/how-do-i-fix-my-echart-charts-that-are-using-bigint[/url]
Мобильная версия