язык C в Linux: вопросы начального уровня

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 11 ноя 2013, 16:53

Очень приличное (собственно, лучшее из существующих, потому что это первоисточник) руководство по стандартной библиотеке C: Библиотека языка C GNU glibc
Библиотека языка C GNU glibc.
Сандра Лузмор (Sandra Loosemore)
Ричард Сталлман (Richard M. Stallman)
Роланд Макграх (Roland MacGrath)
Андрей Орам (Andrew Oram)
ред. 0.06 24.10.1994

Справочное руководство по функциям, макроопределениям и заголовочным файлам библиотеки glibc.
(это перевод).

1. Это, конечно, не "вопросы начального уровня" ;-) ... но: начиная от начального уровня и далее - это справочник.

2. Это, опять же, не сам язык C, а его стандартные библиотеки ... но они настолько сращены, что даже самые ранние редакции книг K&R постоянно ссылаются на библиотеку строчных функций, или ввода-вывода - без которых они не могут простейшие примеры показывать.

3. Этот справочник хорош ещё тем, что позволяет (там обычно указывают) разделить: а). это вызов ANSI C, б). это вызов библиотек POSIX (т.е. только для uNIX), в). это расширение GNU / GCC (т.е. существует только в Linux).
Очень нужно для оценки переносимости кода.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 12 ноя 2013, 01:18

Виктория писал(а):
Olej писал(а):Кстати, с какими компиляторами с языка C работают и с какими знакомятся студенты на 4 курсе, изучающие ПО микропроцессорных систем? ;-)
Надо бы с gcc и IAR.
IAR, как я понимаю - изделие коммерческое? (или есть другие варианты?)

Но раздают некоторые ограниченные реализации: - Downloads, либо триальные (на 30 дней), либо неограниченные, но работающая только на фрагментах кода ограниченного размера (как я это понял?)... какие ограничения?
Вы каким пользуетесь?

И как это можно? и можно ли? использовать не имея микроконтроллера под который делается разработка?

Аватара пользователя
Виктория
Писатель
Сообщения: 113
Зарегистрирован: 28 дек 2012, 14:05
Откуда: Самара
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Виктория » 12 ноя 2013, 09:33

Olej писал(а):
Виктория писал(а):
Olej писал(а):Кстати, с какими компиляторами с языка C работают и с какими знакомятся студенты на 4 курсе, изучающие ПО микропроцессорных систем? ;-)
Надо бы с gcc и IAR.
IAR, как я понимаю - изделие коммерческое? (или есть другие варианты?)

Но раздают некоторые ограниченные реализации: - Downloads, либо триальные (на 30 дней), либо неограниченные, но работающая только на фрагментах кода ограниченного размера (как я это понял?)... какие ограничения?
Вы каким пользуетесь?
Olej, Вы хотите потестировать компиляторы IAR? :-)
Используем конечно же kikstart-версии (EWARM-EVAL, EWSTM8-EVAL, EW430-EVAL). Для скачивания необходимо зарегистрироваться.
И как это можно? и можно ли? использовать не имея микроконтроллера под который делается разработка?
Без микроконтроллера можно - скомпилировать, выполнить программу по шагам в отладчике, но работа внешних устройств микроконтроллера не эмулируется.

Основные производители микроконтроллеров пошли по пути выпуска дешевых evalution board, поэтому в сейфе - зверинец (MSP430 LaunchPad от Texas Instruments, STM8L- и STM32L-Discovery от STMicroelectronics, ...). Стоимость плат от 400 до 800 рублей, подключаются по usb.

А вот ещё! IAR советует посмотреть самим в сторону Eclipse.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 12 ноя 2013, 13:04

Виктория писал(а): Olej, Вы хотите потестировать компиляторы IAR? :-)
Используем конечно же kikstart-версии (EWARM-EVAL, EWSTM8-EVAL, EW430-EVAL). Для скачивания необходимо зарегистрироваться.
Вряд ли я стану в нём что-то проверять: всё тот же C, в рамках ANSI + некоторые ограничения ... никакой новой результативности от проверки, пусть и несколько нетиповых, конструкций - не получишь. О чём это будет говорить? Да ни о чём ... :-(

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 12 ноя 2013, 13:18

Виктория писал(а):Или эти тесты заимствуем из методики изучения иностранного языка? Умения решать задачи - это умения писать осмысленные тексты на иностранном языке, а тесты - умения читать и понимать тексты. Грубое, м.б., сравнение. Зато полезность текстов вроде бы есть.

Я преподаю курс "ПО микропроцессорных систем". Ко мне студенты приходят на 4 курсе.
Мы действительно интересуемся чуть разными вещами:

- ПО микропроцессорных систем - это уже целевое программирование: уже поставлены цели и задачи, и они достигаются. Предполагается, что студента к этому времени досконально обучили языку (языкам) программирования (курсе на 2-м), в данном случае C, и ему остаётся только применять его для этих вот целей... На самом деле, в большинстве случаев, обучили его не "досконально", а "кое-как" ... по учебникам 30-35 летней давности.

- Я же говорю о совершенствовании уровня понимания языка C от уровня "кое-как" до уровня "добротное среднее владение" (т.е. в заголовке темы с "вопросы начального уровня" я слукавил ;-) ), до тог уровня, когда я сам мог бы такого учащегося рекомендовать на штатную оплачиваемую работу.

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

Аватара пользователя
Виктория
Писатель
Сообщения: 113
Зарегистрирован: 28 дек 2012, 14:05
Откуда: Самара
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Виктория » 12 ноя 2013, 14:54

Olej писал(а): Но показать такие фрагменты-тексты - очень полезно: останется на уровне рефлексов, даже забыв почему это так: "никогда не сравнивать в if вещественные значения на равенство..." и др. т.д. и т.п.
:-? Боюсь, что без правильного ответа не запомнют

Аватара пользователя
Виктория
Писатель
Сообщения: 113
Зарегистрирован: 28 дек 2012, 14:05
Откуда: Самара
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Виктория » 12 ноя 2013, 15:05

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 настолько, что уже добавление такого epsilon к 1 будет неотличимо от такого же значения для ещё меньшего epsilon ...
И далее используем 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)
------------------------------------------
Вас не смущает, что независимо от точности представления (float или double) итоговая максимально достижимая точность (относительная) итерационных вычислений остаётся неизменной?
Если посмотреть на эту задачу совсем уж прагматично, то правильный ответ возможен с использованием объединения union и сравнения целых чисел. Хотя, как мне кажется, возможны и более элегантные решения...

Аватара пользователя
Виктория
Писатель
Сообщения: 113
Зарегистрирован: 28 дек 2012, 14:05
Откуда: Самара
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Виктория » 12 ноя 2013, 15:15

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

Код: Выделить всё

#define DIV 10.
int main(void)
{int i;
 union { unsigned long l;
           float f;                 } a, aa;
 union { unsigned long l[2];
            double lf;             } b, bb;

 float x=1.;
 double y=1.;

 printf("Максимальная точность итерационных вычислений\n");
 
 for(i=0;;i++)
 { a.f=1+x;
   x/=(float)DIV;
   aa.f=1+x;
   if(a.l == aa.l) break;  
 }
 
 printf("для float\t: %e (число итераций %d)\n",x,i);
 
 for(i=0;;i++)
 { b.lf=1+y;
   y/=(double)DIV;
   bb.lf=1+y;
   if((b.l[0]==bb.l[0])&&(b.l[1]==bb.l[1])) break; 
 }
 
 printf("для double\t: %e (число итераций %d)\n",y,i);

}
Транслирую командной строкой MinGW

Код: Выделить всё

gcc -o 1.exe 1.c 
и
получаю

Код: Выделить всё

Максимальная точность итерационных вычислений
для float	: 9.999999e-010 (число итераций 8)
для double	: 1.000000e-017 (число итераций 16)
В компиляторе должны быть обработчики исключений по переполнению, потому что пример "на грани фола".
Вложения
1.C
(658 байт) 269 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 12 ноя 2013, 16:42

Виктория писал(а):
Если посмотреть на эту задачу совсем уж прагматично, то правильный ответ возможен с использованием объединения union и сравнения целых чисел. Хотя, как мне кажется, возможны и более элегантные решения...
Хотя бы так
1. А почему так?
Т.е., я понимаю, что вы хотите наблюдать полную побитовую идентичность...
А что происходит при вещественном сравнении?
Типа 1. + X == 1. + X / 2.
(я спрашиваю, потому что не знаю ответа... real-операции в x86 производятся в регистрах FPU - а операция сравнения?)

2. Кстати, по всей книге Моулер & Форсайт (а они считаются крупнейшими мировыми авторитетами в численных методах, наряду с Хэмингом) предел погрешности вычислений определяется именно по схеме:

Код: Выделить всё

do {
   X /= 2.
} while ( 1. + X != 1. + X / 2. );

Виктория писал(а):В компиляторе должны быть обработчики исключений по переполнению, потому что пример "на грани фола".
3. А это как?
(я не понял о чём это утверждение)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 12 ноя 2013, 16:52

Olej писал(а): Моулер & Форсайт (а они считаются крупнейшими мировыми авторитетами в численных методах, наряду с Хэмингом)
Кстати вспомнилось...
Эпиграфом к своей знаменитой книге ... вот этой - Хемминг Р.В. Численные методы для научных работников и инженеров:
Изображение
... так вот, эпиграфом автор выбрал:
Целью вычислений являются не числа, а понимание.
Вот как-раз об этом я и завёл вот эту тему ;-)

P.S. Книгу всем настоятельно рекомендую по ссылке скачать - это безумно интересная книжка для всех, кто занимается вычислениями.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей