Можно ли повысить точность арифтемтики с плавающей точкой с GCC?

StackOverflow https://stackoverflow.com/questions/3774067

  •  04-10-2019
  •  | 
  •  

Вопрос

Некоторая программа в C, которая делает обширные расчеты с плавающей запятой, получают правильные результаты на коробке PC Linux, а неправильные результаты на SPE к сотовым процессоре, но не на PPU клетки. Я использую компиляторы GCC. Интересно, есть ли вариант компиляции GCC для увеличения метода округления или аналогичным образом, поэтому я получаю расчеты прецизионных поплавок с более точностью. Я не могу изменить на двойной, так как на спектакле SPE решит восстановить

Спасибо

Это было полезно?

Решение

На основе IBM Документация для различий от IEEE 754 на SPU, это может быть любое количество вещей:

  • Ноль результатов арифметических операций всегда +0, никогда -0.
  • Деномальные входы от 2-149 до 2-126 до арифметических операций рассматриваются как ноль с одинаковым знаком. Арифметические операции никогда не вызывают денормальные результаты, но вместо этого производят +0.
  • Арифметические операции не поддерживают IEEE INF или NAN. Эти битовые шаблоны представляют собой действительные числа. Результаты переполнения дают максимальное значение величины соответствующего знака.
  • Арифметические операции используют только режим округления округления круглой до нуля (отбивной, усеченной), независимо от настройки режима округления в состоянии состояния и управления с плавающей точкой (FPSCR), который влияет только на арифметические операции двойной точности.

Конечно, на связанной странице, Вы также можете компилировать код SPU для строгого соответствия IEEE:

По умолчанию XL C / C ++ следует больше всего, но не все правила в стандарте IEEE. Если вы компилируетесь с вариантом -qnoStrict, который включен по умолчанию на уровне оптимизации -O3 или выше, некоторые правила с плавающей запятой IEEE нарушаются способами, которые могут повысить производительность, но может повлиять на правильность программы. Чтобы избежать этой проблемы и скомпилировать строгое соответствие стандарту IEEE, выполните следующие действия:

  • Используйте опцию компилятора -QLOAT = NOMAF.
  • Если программа изменяет режим округления во время выполнения, используйте опцию -qfloat = RRM.
  • Если данные или код программы содержат сигнальные значения NAN (Nans), используйте опцию -qfloat = Nans. (Сигнализация NAN отличается от тихого NAN; вы должны явно кодировать его в программу или данные или создавать его с помощью опции компилятора -QINITAUTO.)
  • Если вы скомпилируетесь с3, -O4, или -O5, включите опцию -Qstrict после него.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top