Proteus, KiCAD и другие ECAD Разработчик так или иначе сталкивается с системами автоматизированного проектирования. Данный раздел - по САПР. |
22.02.2007, 18:49
|
|
Прохожий
Регистрация: 25.08.2005
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Советую флоат в епроме не хранить (если числа маленькие), лучше хранить их как инт или лонг. Имею ввиду примерно это
float c;
long k = c*10^(количество разрядов после запятой);
Потом при вычислении использовать тип флоат опять. Но повторяю, это если разрядность твоего числа влезает в разрядность типа данных.
|
|
|
|
23.02.2007, 01:02
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Было принято следующее рещение. Хранить коэффициенты в массивах, а для использования в формуле преобразовывать. Тогда и отображение будет точное и сама переменная будет близка к идеалу. А то запарился я что-то. Конечно было бы очень не плохо разобраться с sprintf, я пробовал и ничего не получилось. Не въехал что-то. Кому интересно нашел в хелпе IAR описание функции sprintf, смотрите в атаче.
Прикрепленный файл: 3375307.rar
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
24.02.2007, 12:57
|
|
Прохожий
Регистрация: 02.11.2006
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Если бы я делал что-то похожее, то я бы сделал примерно так:
//Использовал массив коэффициентов (вещественный тип)
float coeffs[N];
// Ввод коэффициента и отображение его на
// индикаторах.
// На выходе функции значение коэффициента в
// вещественном формате
float enterCoeff( void )
{
// Символьный массив для хранения введенных чисел
char buf[5];
// как-то вводим число
// тут же отображаем введенное число
//..
// записываем введенное число
// в нужную позицию массива, при этом
// преобразуем десятичное число в ASCII код
if( это число )
buf[i] = десятичное_число + '0';
else
buf[i] = '.';
buf[4] = 0; // Формируем строку
// используем стандартную функцию для перевода
// строки в вещественное число
// (исп. #include ‹stdlib.h›)
return atof(buf);
}
/* Пример как может выглядеть массив:
buf[0] = '1';
buf[1] = '7';
buf[2] = '.';
buf[3] = '1';
buf[4] = 0;
*/
Дальше где нужно используем:
coeffs[i] = enterCoeff();
|
|
|
|
24.02.2007, 17:56
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Спасибо большое всем, кто отозвался на мою проблему!!! Я решил ее немного по другому: оставил только один знак после запятой, а ввожу число путем манипуляций с этим же числом. Все работает просто отлично, но без вашей помощи я бы долго еще мучился.
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
25.02.2007, 02:20
|
|
Прохожий
Регистрация: 28.09.2006
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
masterpc пробовал ли ты заменить
switch (point){
case 0 : break;
case 1 : SUM=SUM/100; break;
case 2 : SUM=SUM/10; break;
}
на
switch (point){
case 0 : break;
case 1 : SUM=SUM*0.01; break;
case 2 : SUM=SUM*0.1; break;
}
?
|
|
|
|
28.02.2007, 11:37
|
|
Прохожий
Регистрация: 24.08.2005
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от masterpc
|
Конечно было бы очень не плохо разобраться с sprintf, я пробовал и ничего не получилось. Не въехал что-то. Кому интересно нашел в хелпе IAR описание функции sprintf, смотрите в атаче.
|
Согласно приложенному описанию, то что я вам написал должно работать, если sprintf поддерживает то, что описано в описании про printf:
Код:
|
sprintf(buf, "%.1f", SUM); |
А вот конкретный пример из вашей документации (выделил важное):
Цитата:
|
printf("%.0f %#.0f", 31.0, 31.0)generates 31 31.
You write %g or %G to generate a signed decimal fractional representation with or without a decimal power-of-ten exponent, as appropriate. For %g conversion, the generated text takes the same form as either %e or %f conversion. For %G conversion, it takes the same form as either %E or %F conversion. The precision p specifies the number of significant digits generated. (If p is zero, it is changed to 1.) If %e conversion would yield an exponent in the range [-4, p), then %f conversion occurs instead. The generated text has no trailing zeros in any fraction and has a decimal point only if there are nonzero fraction digits, unless you specify the # format flag.
|
Прикрепленный файл: 3375307.rar
|
|
|
|
01.03.2007, 22:43
|
|
Вид на жительство
Регистрация: 27.07.2006
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Тут просто все. Возьми и проведи вычесления: отдельно целая часть, отдельно дробная.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:16.
|
|