2016-12-13 4 views
1

Я вычислил много cos(x) в моей программе. Насколько эффективнее Fortran придерживаться cos(x) или рассчитать sqrt(1-sin(x)**2)? Смогу ли я жертвовать какой-либо точностью, если метод sqrt более эффективен? И, я думаю, самый важный вопрос, если sqrt более эффективен. Могу ли я ожидать, что компилятор все равно узнает об этом и изменит его для меня?Производительность Cos vs. Sqrt (1 - Sin() ** 2)

+5

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

+1

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

ответ

2

Первое, что вы должны отметить, это то, что вам нужно быть осторожным, чтобы выбрать правильный корень для sqrt(1 - sin(x)**2), иначе вы рискуете оценить |cos(x)|, что не то же самое. Это само по себе добавляет сложности.

Использовать cos(x), так как вам следует избегать таких предполагаемых микрооптимизаций: вы превзошли любой подход к оптимизации, принятый современным компилятором FORTRAN.

Даже когда я использовал FORTRAN, умные компиляторы FORTRAN использовали бы триггерные функции, доступные на чипсете. sqrt по-прежнему в целом реализован с использованием алгоритма типа Ньютона-Рафсона, и его оценка займет несколько часов.

Моя догадка заключается в том, что последние компиляторы будут отменить вашу личность для вас и заменить cos(x): проверить выходную сборку.

Но если у вас есть какие-либо сомнения, профайл.

+2

На самом деле, я не уверен, будет ли компилятор переключаться между 'cos (x)' и идентификатором. Если 'x' не ограничено между' -pi/2' и 'pi/2' или положительными диапазонами' cos', переход на идентичность заставит ответ всегда быть положительным и приведет к неправильным результатам. – Higgy

+0

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

+0

@Ross Ahhh спасибо. Вот чего я боялся и был частью моего вопроса. Любая идея величины ошибки? – Higgy