Ср апр 02, 2014 14:44:41
Ср апр 02, 2014 16:08:04
Ср апр 02, 2014 16:15:02
ibiza11 писал(а):так вот вопрос : что лучше использовать?
Ср апр 02, 2014 16:40:26
По мне, 1/2^10=1/1024=0,0009765625. По вопросу - я бы выбрал первый вариант. Главное, правильный порядок выполнения операций, чтобы не было потери значимости и переполнения.ibiza11 писал(а):с ценой одного разряда равной 0,0009765625 (2 ^ -10) = 1/65536
Ср апр 02, 2014 22:22:36
Ср апр 02, 2014 23:48:13
Чт апр 03, 2014 00:06:13
ibiza11 писал(а):Я пока тоже склоняюсь к первому варианту, привычнее как то....
Чт апр 03, 2014 07:22:47
Чт апр 03, 2014 10:26:55
кажется или точнее? как по мне, точность зависит от самого числа, кратно оно "цене деления" в текущем представлении или нет. (0.001 и 0,0009765625 в первом и втором случаях соответственно)ploop писал(а):Второй вариант, кажется, будет точнее при различных математических операциях.
не понимаете причин, почему я склоняюсь к первому варианту? Если да, то все просто: я никогда не работал с фиксированной точкой)HHIMERA писал(а):Честно... не понимаю причин... или что-то недоговаривается...
Именно!) Отличный вывод! Мне нужно чаще вычисления, чем вывод на человеко-читаемый терминал ( ). Вычисления должны быть по возможности быстрые. Сдвиг на ARM выполняется одной командой, поэтому второй вариант выгоднее в плане времени выполнения. Спасибо, Kavka)Kavka писал(а):Для "десятичного" варианта проще преобразование в человеко читаемый вид - itoa, printf("%d") и т.д. с вставкой точки в нужное место.
Для "двоичного" нужен соответствующий алгоритм. Например, сначала привести к "десятичному" варианту с требуемой точностью...
Чт апр 03, 2014 16:22:37
Чт апр 03, 2014 19:00:23
Чт апр 03, 2014 23:21:43
Пт апр 04, 2014 00:03:40
Пт апр 04, 2014 00:28:17
Пт апр 04, 2014 06:04:30
Пт апр 04, 2014 10:34:43
Чтобы ни при каких обстоятельствах не было 1.259998 руб, а было всегда 1.26 руб.
Пт апр 04, 2014 12:30:49
рассматривать как призыв включить мозги и подумать, то я только за.HHIMERA писал(а):Сколько там видов округлениия... ась??? Там только банковских несколько...
Пт апр 04, 2014 13:34:55
Kavka писал(а):С копейками - это да, наверное, самый яркий пример. Кто это "прочувствовал" на практике - понимают.
Пт апр 04, 2014 13:59:28
// Показометр
//*************************************************************
int32_t ReadShuntCurrent(void)
{
int32_t III = 0;
uint16_t Ip = 0;
uint16_t In = 0;
Ip = adc_read(INP_I_POS);
if(Ip >= 33){Ip -= CR_P_BIAS;}
else{Ip = 0;}
In = adc_read(INP_I_NEG);
if(In >= 33){In -= CR_N_BIAS;}
else{In = 0;}
if(Ip > 0)
{
III = (int32_t)(Ip * 10);
III *= setup.ip_mul_coeff;
III /= setup.ip_div_coeff;
}
else
{
if(In > 0)
{
III = (int32_t)(In * 10);
III *= setup.in_mul_coeff;
III /= setup.in_div_coeff;
III = -III;
}
else
{
III = 0;
}
}
return III;
}
//Показометр получше
//*************************************************************
float ReadShuntCurrent(void)
{
int32_t III = 0;
uint16_t Ip = 0;
uint16_t In = 0;
Ip = adc_read(INP_I_POS);
if(Ip >= 33){Ip -= CR_P_BIAS;}
else{Ip = 0;}
In = adc_read(INP_I_NEG);
if(In >= 33){In -= CR_N_BIAS;}
else{In = 0;}
if(Ip > 0)
{
III = ((setup.ADC_Vps * Ip) / setup.IP_Kamp) / t_init.Kshunt;
}
else
{
if(In > 0)
{
III = ((setup.ADC_Vps * In) / setup.IN_Kamp) / t_init.Kshunt;
III = -III;
}
else
{
III = 0;
}
}
return III;
}
Пт апр 04, 2014 16:28:02