2012-07-06 2 views
0

Я занимаюсь DSP в Хаксе. Некоторые из моих DSP включают в себя рекурсивные алгоритмы, которые могут генерировать денормальные (ака субнормальные) числа. Некоторые платформы плохо работают при столкновении с такими цифрами, что делает невозможным обработку в реальном времени (и даже автономную обработку, в некоторых случаях, значительно сложнее). Очевидно, что выполняются только алгоритмы, которые производят очень маленькие числа (например, посредством рекурсивного умножения), но я работаю с ними.Избегайте денормалов в Haxe

Одна очень распространенная процедура для решения этой проблемы просто так:

if r is a denormal 
    r <- 0 

Это прекрасно работает, когда денормализованные числа слишком малы, чтобы иметь никакого влияния на данный алгоритм, который (в значительной степени) всегда.

Я ищу для создания ряда платформ и хотел бы избежать этих головных болей, прежде чем они произойдут в максимально возможной степени. Итак, вопрос в том, как быстро и эффективно определить/устранить денормалы в Хаксе?

Это может нарушить другие вопросы, такие как: имеет ли Haxe специфический для языка метод обработки денормалов или это зависит от платформы? (Я ничего не вижу в документах - даже функция isDenormal). Если это зависит от платформы, есть ли флаг или что-то еще? Как я узнаю, какие платформы нуждаются в специальной обработке, а какие нет?

Большое спасибо!

ответ

1

Haxe не поддерживает эти операции. Проблема в том, что на большинстве платформ, на которые он распространяется, также нет никакой поддержки. Я говорю в основном о JavaScript, Flash, PHP и Neko. Вы можете, конечно, создать свою собственную библиотеку и попытаться оптимизировать вещи, где это возможно, используя встроенные строки.

+0

Хорошо, но во всех этих случаях я мог бы, по крайней мере, сказать через флаг/# define/etc, что характеристики платформы для денормалов. Как бы то ни было, я должен создать lib с #ifdef для каждой платформы и сделать обнаружение денормации вдали от оптимальных способов. –

+0

Ну, вы всегда можете определить ограничение самостоятельно: (((x <0)? -x: x) <1e-15? 0: x) – Waneck

+1

Bjorn, вы можете определить эту функцию самостоятельно: public => static inline function needDenormFix() return #if java || php true #else false #end <=. Просмотрите спецификации каждой платформы для точного списка «хороших» платформ. Тем не менее, я считаю, что просто использовать свой собственный код для обработки этого для всей платформы не повредит. – stroncium