Поведение встроенной функции fortran sqrt()

У меня есть сценарий, в котором я пытаюсь выполнить сложное приложение в AIX и Linux.

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

Кто-нибудь знает причину такого поведения? Есть ли способ побороть это?

P.S

Некоторые значения одинаковы на обеих машинах, но большинство из них разные.


person arunr    schedule 04.11.2013    source источник
comment
Вы имеете в виду complex или complicated ?   -  person High Performance Mark    schedule 04.11.2013
comment
@HighPerformanceMark я имел в виду сложный   -  person arunr    schedule 04.11.2013


Ответы (3)


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

  1. Один из процессоров не соответствует спецификации IEEE 754 с плавающей запятой.
  2. Значения действительно одинаковы, но из-за ошибки или различия, связанного с печатью, они выглядят по-разному.
  3. Режим округления или управление точностью не установлены одинаково в обеих системах.
  4. Одна система пытается следовать спецификации IEEE 754, но имеет несовершенство функции извлечения квадратного корня.

Вы сравнивали двоичный вывод, чтобы исключить возможность ошибки форматирования печати или различия?

Большинство современных процессоров поддерживают операции с плавающей запятой IEEE 754. Примером, когда точность IEEE 754 не гарантируется, является функция OpenCL native_sqrt. OpenCL определяет native_sqrt (в дополнение к sqrt, совместимому с IEEE 754), так что при желании скорость можно обменять на точность.

Ошибки в реализациях IEEE 754 sqrt сегодня не слишком распространены. Сложный случай для функции IEEE 754 sqrt возникает, когда режим округления установлен до ближайшего, а фактический результат очень близок к средней точке между двумя представлениями с плавающей запятой. Метод создания этих сложных аргументов квадратного корня можно найти в статье Уильяма Кахана How для проверки правильности округления SQRT.

person Community    schedule 05.11.2013

Могут быть небольшие различия в числовом представлении оборудования на двух компьютерах или в алгоритме, используемом для функции sqrt двух компиляторов. Арифметика с конечной точностью отличается от арифметики действительных чисел, и следует ожидать небольших различий в вычислениях. Чтобы судить о том, являются ли различия необычными, вы должны указать числовой тип, который вы используете (по просьбе Чаккоттрила), и привести примеры. В чем относительная разница. Для значений порядка единицы 1E-9 является ожидаемой разницей для одинарной точности с плавающей запятой.

person M. S. B.    schedule 04.11.2013

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

Плавающая точка является приближением. Одинарная точность с плавающей запятой использует только 24 бита (включая бит знака) для мантиссы, а остальные 8 бит - для экспоненты. Это обеспечивает точность около 8 цифр. Двойная точность с плавающей запятой использует 53 бита, что обеспечивает гораздо большую точность.

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

person ChuckCottrill    schedule 04.11.2013
comment
Я уже указал формат на обеих машинах. Формат тот же, но результат другой. Диапазон разницы составляет около e-09 - person arunr; 04.11.2013