Смотрите каких интересных (как мне кажется) примеров я вам подкину на "придумать алгоритм и реализовать его в программе" :Olej писал(а):А последствий из этого простейшего примера можно сделать немало:Виктория писал(а): Мне не совсем понятно назначение тестов в преподавании программирования. Почему бы не использовать лишь задачи на "придумать алгоритм и реализовать его в программе"?
Итерационные вычисления, приближения ... Это не только часть вычислительной математики, но и, временами, составная часть программ обрабатывающих экспериментальные данные ... или внешние данные в АСУТП + итерационная подгонка параметров модели процесса под полученные данные. Иногда это происходит в реальном времени, многократно и часто .
В примитивном виде итерационное приближение записывают так:
Код: Выделить всё
while( <что-то> < 1.E-7 ) {
... // продолжпем
}
Где вот то <что-то> - это "невязка", расхождение ... а сравнивается оно с малым значением epsilon (1.E-7), берущимся "с потолка".
Гораздо лучше при старте программы вычислить оценку этого epsilon для нашей конкретной платформы (процессор, ОС, компилятор, библиотеки, ...).
Что-то типа:
Код: Выделить всё
double epsilon = 1.;
while( 1 ) {
if( 1. + epsilon == 1. + epsilon / 10. ) break;
epsilon /= 10.;
}
И далее используем epsilon увеличенное на 1-2 итерации назад (для страховки)...
Об этом много написано такими классиками математических численных вычислений как Дж.Форсайт, М.Малькольм, К.Моулер "Машинные методы математических вычислений.".
Вот предлагаю такой тест:
Код: Выделить всё
#define DIV 10.
void test021( void ) { // максимальная точность итерационных вычислений
printf( "максимальная точность итерационных вычислений:\n" );
int i;
float x = 1.;
double y = 1.;
for( i = 0; ; i++ ) {
if( (float)1. + x == (float)1. + x / (float)DIV ) break;
x /= (float)DIV;
}
printf( "для float\t: %e (число итераций %d)\n", x, i );
for( i = 0; ; i++ ) {
if( ( (double)1. + y ) == ( (double)1. + y / (double)DIV ) ) break;
y /= (double)DIV;
}
printf( "для double\t: %e (число итераций %d)\n", x, i );
}
Код: Выделить всё
olej@notebook:~/2013_WORK/AntonG/examples$ ./type 2
02 ---------------------------------------
максимальная точность итерационных вычислений:
для float: 1.000000e-20 (число итераций 20)
для double: 1.000000e-20 (число итераций 20)
------------------------------------------
P.S. Прилагаемый файл 1.c - это из состава архива examples.tgz, но так ещё этого теста не было ... но не архивировать же всё по малейшему чиху?