Как избежать денормалей в Haxe

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

Одна очень распространенная процедура для решения проблемы заключается в следующем:

if r is a denormal
   r <- 0

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

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

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

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


person Bjorn Roche    schedule 06.07.2012    source источник


Ответы (1)


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

person Franco Ponticelli    schedule 06.07.2012
comment
Хорошо, но во всех этих случаях я мог бы, по крайней мере, сказать через флаг/#define/etc, каковы характеристики платформы для денормалей. Как бы то ни было, я должен создать библиотеку с #ifdef для каждой платформы и выполнить определение денормализма далеко не оптимальным образом. - person Bjorn Roche; 07.07.2012
comment
Ну, вы всегда можете определить предел самостоятельно: (( (x ‹ 0) ? -x : x ) ‹ 1e-15 ? 0 : x ) - person Waneck; 08.07.2012
comment
Бьорн, вы можете сами определить эту функцию следующим образом: public => статическая встроенная функция needDenormFix() return #if java||php true #else false #end ‹=. Изучите спецификации каждой платформы, чтобы получить точный список хороших платформ. Тем не менее, я считаю, что простое использование вашего собственного кода для обработки этого для всей платформы не повредит. - person stroncium; 23.07.2012
comment
О, и все будет встроено, поэтому для каждой платформы будет скомпилирована только одна ветвь if(needDenormFix()){}else{}. - person stroncium; 23.07.2012