поведение приведения к нулю в арифметике с плавающей точкой - PullRequest
13 голосов
/ 18 января 2010

Хотя, насколько я помню, IEEE 754 ничего не говорит о режиме сброса в ноль для ускорения обработки денормализованных чисел , некоторые архитектуры предлагают этот режим (например, http://docs.sun.com/source/806-3568/ncg_lib.html).

В частном случае данной технической документации стандартная обработка денормализованных чисел используется по умолчанию, и сброс в ноль должен быть явно активирован. В режиме по умолчанию денормализованные числа также обрабатываются программно, что медленнее.

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

В этом контексте мой вопрос состоит из двух частей:

  1. среди встроенных архитектур, существуют ли архитектуры, которые предлагают только «обнуление» ? Возможно, им не нужно было бы рекламировать себя как «IEEE 754», но они могли бы предлагать достаточно близкие операции с плавающей точкой в ​​стиле IEEE 754.

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

Обработка сброса в ноль в интервальной арифметике, которую я использую для значений с плавающей запятой, достаточно проста: если я знаю, что должен это сделать, у меня вопрос больше, должен ли я это делать.

Ответы [ 2 ]

8 голосов
/ 18 января 2010

Да на оба вопроса. Есть платформы, которые поддерживают только сброс в ноль, и есть много платформ, где сброс в ноль установлен по умолчанию.

Вы также должны знать, что многие встраиваемые платформы и платформы dsp используют режим «Denormals Are Zero», что является еще одним недостатком в семантике с плавающей точкой.


Редактировать дальнейшее объяснение ЗСТ против DAZ:

В ЗСТ, когда операция выдаст денормальный результат по обычной арифметике, вместо нее возвращается ноль. Обратите внимание, что некоторые реализации всегда сбрасываются в положительный ноль, тогда как другие могут сбрасываться в положительный или отрицательный ноль. Вероятно, лучше не зависеть ни от одного из них.

В DAZ, когда вход в операцию является денормальным, на его место подставляется ноль. Опять же, нет общей гарантии того, какой ноль будет заменен.

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

Обратите внимание, что некоторые реализации объединяют эти два режима в "Flush to Zero". Например, в режиме ARM VFP "сброс до нуля" используются как FTZ, так и DAZ.

2 голосов
/ 18 января 2010

Ядра ARM Cortex имеют опцию сброса в ноль, трудно понять, как ее можно игнорировать. Опять же, не пользуйтесь бизнес-советами на форуме. Поговорите со своими клиентами.

...