|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : U.P.Galyuck 2:5020/400 30 Mar 2005 15:07:01 To : Serguei Miridonov Subject : Re: Need GUI development tool (Kylix or something) -------------------------------------------------------------------------------- > 4. Учитывая (2) и (3) можно сказать, результат вычислений с > несколькими операндами практически неизбежно будет зависеть от > порядка промежуточных вычислений. За примером даже не надо ходить в > сторону комплексных чисел, достаточно поскладывать группы чисел, > одни из которых много больше других. Это безусловно верно. > 5. Языки высокого уровня обычно могут использоваться на машинах с > разной архитектурой, в связи с этим желательно, чтобы алгоритмы > разработанные под решение, в некотором смысле, универсальных задач > (решение дифф. уравнений, интегрирования и многие другие) тоже были > портируемыми, т.е. результаты вычислений не сильно бы зависели от > архитектуры, а также - чтобы разработанные алгоритмы сохраняли > устойчивость при переходе с одной машины на другую. Кроме этого, > необходимо чтобы выполнение алгоритмов не сильно зависело и от > компилятора. Подойдите ко всему этому с практической точки зрения - если результат сильно зависит от транслятора, типа машины и т.д., то он (алгоритм) просто не верен. Типа как немножко забеременеть. Меры достижения стабильности хорошо известны - повышение точности промежуточных результатов, расшивка окрестности особых точек, и т.д. Стабильно же неверный результат никому не нужен. > > Поясняю, что имеется в виду. Пусть требуется поделить два числа z=x/y. > > Если числа вещественные, то это делается в одну операцию. При комплексной > > реализации той же операции, числитель и знаменатель домножаются на > > комплексно сопряженное знаменателю, после чего происходит операци деления. С > > математической точки зрения делается z=x*y/y**2 (мы учитываем наличие > > нулевых мнимых частей). Ясно, что второй вариант потенциально опаснее с > > точки зрения переполнения, и если компилятор сумел избежать лишних > > вычислений, то он молодец. Отсюда и следует, что оптимизация выражений > > расширяет диапазон исходных данных. > > Вопрос: а _обязан_ ли компилятор заниматься оптимизацией? Откуда ему > знать, будет ли нулевой мнимая часть чего-то во время выполнения? Так он и не знает, просто вычисления связанные с умножением на ноль я не выписывал. Главное - в вынужденности возведения в квадрат знаменателя. Hо вот то, что у действительных чисел нет мнимой части компилятор знает точно. > Если так рассуждать, то Вы скоро вмените в обязанность компилятору > вызывать алгоритм сортировки чисел перед сложением. Хороший компилятор - обязан заниматься оптимизацией, если его об этом попросят. Если компилятор сможет выполнить сортировку на стадии компиляции, уменьшив объем вычислений на стадии выполнения - флаг ему в руки. Кстати, с константами он нечто подобное делает, т.к. их свойства заранее известны. > > Да, а что, есть в стандарте запрет на оптимизацию выражений? Где это > > написано? > > Hаписано про регламентированный порядок вычислений. Ссылку я > приводил в одном из моих предыдущих постингов, но Вы её проигнорировали. > > Оптимизация же допускается, однако если это отступление от > стандарта, то это должно быть отражено в мануале на компилятор и > включаться явно: опцией, а ещё лучше - прагмой, потому, как в одной > части алгоритма это может быть приемлемо, а в другой - нет. А что, кто-то против этого возражал? --- ifmail v.2.15dev5.3 * Origin: St.Petersburg University (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.linux/6578d2061df7.html, оценка из 5, голосов 10
|