Есть ли компиляторы, которые оптимизируют операции с плавающей точкой для точности (в противоположность скорости)?

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

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

Так операция с плавающей точкой как

y = x*(a + b); // faster but less accurate

Должен быть изменен на

y = x*a + x*b; // slower but more accurate

Есть ли какие-либо компиляторы, которые оптимизируют для улучшенной точности с плавающей точкой за счет скорости как, я показал выше? Или основное беспокойство скорости компиляторов с рассмотрением точности операций с плавающей точкой?

Спасибо

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

5
задан hhafez 14 January 2010 в 00:46
поделиться

3 ответа

Ваша предположение неисправен. X * (A + B) , является (в целом) не менее точнее, чем X * A + X * B . На самом деле, часто будет более точнее, потому что он выполняет только две операции с плавающей точкой (и, следовательно, возникает только два ошибки округления), тогда как последнее выполняет три операции.

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

Это относится к тому, что если человек, пишет программу на самом деле x * (a + b) , а также конкретно ждет точно округления, вызванные этой конкретной последовательностью операций? Такая вещь на самом деле довольно распространена в высококачественных численных алгоритмах.

Лучше делать то, что написал программист, а не то, что вы думаете, он мог бы намереваться.

Отредактируйте - Пример, чтобы проиллюстрировать случай, когда преобразование вы предложили приводит к катастрофической потере точности: предположим, что

x = 3.1415926535897931
a = 1.0e15
b = -(1.0e15 - 1.0)

, оценка в Двойной Мы получаем:

x*(a + b) = 3.1415926535897931

, но

x*a + x*b = 3.0
10
ответ дан 13 December 2019 в 05:35
поделиться

Нет, нет. Стивен Канон дает несколько веских причин, почему это будет глупое представление, и он прав; Таким образом, вы не найдете компилятора, который это делает.

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

0
ответ дан 13 December 2019 в 05:35
поделиться

К счастью, какао на рабочем столе и какао Touch очень похожи. Я бы порекомендовал просто загрузить какой-то код для начинающих с веб-сайта Apple. Поскольку вы уже знаете Objective-C / Cocoa, вы должны уметь легко следить. Если некоторые части запутаются, вы можете покроить гиды Apple.

Вещи, которые одинаковы:

  • Шаблоны дизайна (цель / действие, делегат, источник данных, первый ответчик и т. Д.)
  • Objective-C
  • Builder

вещи, которые отличаются:

  • Упражнение может иметь только одну цель и действие. На iPhone вы можете иметь одну цель / действие для подзакоза внутрь, коснуться снаружи и т. Д. На Mac есть только один.
  • NSWINDOWCONTROLLER Для загрузки XIBS (концептуально похожее на UiviewController, хотя)

Редактировать: в целом, основной другой iPhone имеет более «предварительно встроенные классы пользовательских интерфейсов» (UinavigatingController, UitabbarController и т. Д.) Вы можете использовать в вашем приложении Чтобы он выглядел красиво и красиво (и самое главное, соответствует Apple Apps).

-121--3153548-

компиляторы обычно «оптимизируют» для точности скорости, точность, определенную как точную реализацию стандарта IEEE 754. Принимая во внимание, что целочисленные операции могут быть переупорядочены любым способом, который не вызывает переполнения, операции FP должны выполняться именно так, как указывает программист. Это может пожертвовать численную точностью (обычные C компиляторы не оборудованы для того, чтобы оптимизировать для этого), но добросовестно реализуют то, что спросил программист.

Программист, который уверен, что он не оптимизирован вручную для точности, может включать функции компилятора, такие как GCC -FUNSAFE-Math-оптимизации , а , только для чего-математики дополнительная скорость. Но обычно нет большого усиления.

2
ответ дан 13 December 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: