Поведение flush-to-zero в арифметике с плавающей запятой

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

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

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

В этом контексте мой вопрос двоякий:

  • среди встроенных архитектур, существуют ли архитектуры, которые предлагают только flush-to-zero? Возможно, им не пришлось бы рекламировать себя как "IEEE 754", но могли бы предлагать операции с плавающей запятой в режиме IEEE 754.

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

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

Ответ 1

Да на оба вопроса. Существуют платформы, поддерживающие только флеш-ноль, и есть много платформ, где по умолчанию используется сброс в ноль.

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


Изменить дальнейшее объяснение FTZ против DAZ:

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

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

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

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

Ответ 2

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