2015-03-11 17 views
0

Я кодирую короткую демонстрационную версию в Canvas с помощью JS, и она работает не так гладко, как должно, в основном потому, что есть довольно много синусов и косинусов.Могу ли я ограничить точность поплавка?

Мне нужно сделать эти вычисления, чтобы нарисовать вещи на экране. Дело в том, что я не нуждаюсь в 7 десятичных знаках, чтобы знать положение пикселя (два уже были бы излишними), поэтому я подумал, что, возможно, он будет работать быстрее, если я могу ограничить операции float двумя десятичными знаками. Это возможно?

+0

Я ссылаюсь на [это] (http://stackoverflow.com/a/3842276/1702990) относительно того, почему это, вероятно, невозможно. TLDR; Вероятно, это реализовано на аппаратном уровне. Однако вы можете попытаться написать собственное приближение. – Sinkingpoint

+0

Скорость вычислений не связана с количеством десятичных знаков. Если вы много раз вызываете триггерные функции в замкнутых циклах, рассмотрите предварительно заполненную таблицу поиска (заполненную один раз при загрузке страницы). –

+1

Кроме того, это своего рода микро-оптимизация, которая пахнет отсутствием какой-либо формы профилировщика. – Sinkingpoint

ответ

0

Вы можете рисовать быстрее, если придерживаться целых чисел. Например, вы можете использовать draw a circle с использованием целочисленной арифметики.

+0

Javascript не имеет целых чисел :( – Kos

+1

Тем не менее, может быть хорошей идеей придерживаться арифметически «легких» алгоритмов (например, в том же примере, с рисованием круга без выделения квадратного корня). – victor

0

Невозможно изменить точность типа с плавающей точкой: они фиксируются аппаратным обеспечением (и обычно языковыми стандартами). На другом языке вы можете использовать тип меньшей точности (например, на C вы могли бы использовать float вместо double), но это невозможно в JavaScript, так как все числа удваиваются.

Что вы можете сделать, это использовать более быстрое приближение к синусоидальной функции. Как правило, грех/соз функции состоит из двух этапов:

  1. в «диапазоне восстановлени», чтобы найти целое число п и всплывают у на интервале [- π/4, π/4], что х = п * π/2 + y. Это невозможно выполнить с помощью стандартной операции mod (%), так как π не может быть точно представлен числом с плавающей запятой.
  2. «ядро» для вычисления соответствующего sin/cos, обычно использующего полиномиальное приближение.

(вы можете увидеть источник V8 here).

Итак, есть несколько вещей, которые вы можете сделать:

  • Используйте аргументы, которые уже уменьшенные до соответствующего интервала, или в качестве альтернативы, использовать приближенное сокращение (т.е. y = x % Math.PI/2)

  • Используйте более быстрая (и менее точная) аппроксимация sin/cos: в Интернете есть много материала, например here.

Смежные вопросы