|
Гашение незначащих нулей, кто как делает? |
|
|
|
Aug 31 2008, 10:55
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Пока вижу два варианта вывода числа на ЖКИ с гашением незначащих нулей: Код #include <stdlib.h> div_t dtmp; char str_tmp[6]; str_tmp[5] = 0; OborotiZaMin = (OborotiZaMinConst + (PPeriod >> 1)) / PPeriod;
#if 0
dtmp = div(OborotiZaMin, 10); str_tmp[4] = dtmp.rem + '0'; dtmp = div(dtmp.quot, 10); str_tmp[3] = dtmp.rem + '0'; dtmp = div(dtmp.quot, 10); str_tmp[2] = dtmp.rem + '0'; dtmp = div(dtmp.quot, 10); str_tmp[1] = dtmp.rem + '0'; str_tmp[0] = dtmp.quot + '0'; // Гашение незначащих нулей for (i = 0; i < 4; ++i) if (str_tmp[i] == '0') str_tmp[i] = ' '; else break;
#else i = 0; dtmp = div(OborotiZaMin, 10000); if (dtmp.quot != 0) str_tmp[i++] = dtmp.quot + '0';
dtmp = div(dtmp.rem, 1000); if (i || (dtmp.quot != 0)) str_tmp[i++] = dtmp.quot + '0'; dtmp = div(dtmp.rem, 100); if (i || (dtmp.quot != 0)) str_tmp[i++] = dtmp.quot + '0'; dtmp = div(dtmp.rem, 10); if (i || (dtmp.quot != 0)) str_tmp[i++] = dtmp.quot + '0'; str_tmp[i++] = dtmp.rem + '0'; str_tmp[i] = 0; #endif // LCD_Write Дабы на ЖКИ небыло такого, например "0750", а было такое "750". Какой алгоритм используете?
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
 |
Ответов
|
Aug 31 2008, 14:14
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата Ну и унивесализм, как по радиксу, так и по количеству цифирей, естественно, пожирает ресурсы. Код сгенерированый GCC для функции itoa предложенной alux, с фиксированым радиксом (которая на самом деле являеться utoa): Код .global itoa .type itoa, @function itoa: .LFB0: .LM1: .LVL0: push r16 push r17 push r28 push r29 /* prologue: function */ /* frame size = 0 */ movw r28,r24 movw r16,r22 .LM2: ldi r18,hi8(10000) cpi r24,lo8(10000) cpc r25,r18 brsh .L2 .LVL1: ldi r24,lo8(0) .LVL2: rjmp .L3 .LVL3: .L2: .LM3: movw r30,r24 subi r30,lo8(-(-10000)) sbci r31,hi8(-(-10000)) movw r24,r30 .LVL4: ldi r22,lo8(10000) ldi r23,hi8(10000) call __udivmodhi4 movw r28,r24 .LM4: movw r24,r30 ldi r22,lo8(10000) ldi r23,hi8(10000) call __udivmodhi4 subi r22,lo8(-(49)) movw r30,r16 st Z+,r22 movw r16,r30 ldi r24,lo8(1) .LVL5: .L3: .LM5: ldi r31,hi8(1000) cpi r28,lo8(1000) cpc r29,r31 brsh .L4 tst r24 breq .L5 .L4: movw r24,r28 .LVL6: ldi r22,lo8(1000) ldi r23,hi8(1000) call __udivmodhi4 mov r18,r22 movw r24,r28 ldi r22,lo8(1000) ldi r23,hi8(1000) call __udivmodhi4 movw r28,r24 subi r18,lo8(-(48)) movw r30,r16 st Z+,r18 movw r16,r30 ldi r24,lo8(1) .LVL7: .L5: .LM6: cpi r28,100 cpc r29,__zero_reg__ brsh .L6 tst r24 breq .L7 .L6: movw r24,r28 .LVL8: ldi r22,lo8(100) ldi r23,hi8(100) call __udivmodhi4 mov r18,r22 movw r24,r28 ldi r22,lo8(100) ldi r23,hi8(100) call __udivmodhi4 movw r28,r24 subi r18,lo8(-(48)) movw r30,r16 st Z+,r18 movw r16,r30 ldi r24,lo8(1) .LVL9: .L7: .LM7: cpi r28,10 cpc r29,__zero_reg__ brsh .L8 tst r24 breq .L9 .L8: movw r24,r28 .LVL10: ldi r22,lo8(10) ldi r23,hi8(10) call __udivmodhi4 mov r18,r22 movw r24,r28 ldi r22,lo8(10) ldi r23,hi8(10) call __udivmodhi4 movw r28,r24 subi r18,lo8(-(48)) movw r30,r16 st Z+,r18 movw r16,r30 .LVL11: .L9: .LM8: movw r18,r28 subi r18,lo8(-(48)) movw r30,r16 st Z+,r18 .LM9: movw r28,r16 .LVL12: std Y+1,__zero_reg__ .LM10: movw r24,r30 .LVL13: /* epilogue start */ pop r29 pop r28 pop r17 pop r16 .LVL14: ret .LFE0: Код функции uitoa из avr-libc c радиксом: Код X_movw ZL, r_str_lo; &string X_movw r_lstr_lo, ZL; save &string cpi r_radix, 2; no radix < 2 brlt 99f cpi r_radix, 37; no radix > 36 brge 99f 1: mov r22, r_radix; radix clr r23; dividend in r25:r24, divisor in r23:r22 XCALL _U(__udivmodhi4); quotient in r23:r22, remainder in r25:r24 ; clobbered: r0, r21, r26, r27 ; call-used but preserved: r18,r19,r20,r30,r31 subi r24, 0xd0; + '0' cpi r24, 0x3a; > '9' ? brlt 10f subi r24, 0xd9; + 'a' - 10 - '0' 10: st Z+, r24; write char to string in reverse order! X_movw r_val_lo,r22; quotient -> dividend sbiw r_val_lo,0; value == 0 ? brne 1b 99: st Z, __zero_reg__; terminate string X_movw r_val_lo, r_lstr_lo; restore &string as return value XJMP _U(strrev); reverse string Обе используют __udivmodhi4, размер strrev используемой в uitoa из avr-libc - 16 инструкций. Анатолий.
Сообщение отредактировал aesok - Aug 31 2008, 14:35
|
|
|
|
|
Aug 31 2008, 15:09
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(aesok @ Aug 31 2008, 18:14)  Обе используют __udivmodhi4, размер strrev используемой в uitoa из avr-libc - 16 инструкций. Единственное замечание, что в случае большой загруженности проца, надо __udivmodhi4 срочно менять на поразрядное вычитание числа 10^n. С точки зрения эргономики - масса вариантов: выравнивание, положение знака, правые незначащие, возникающие, если у Вас фиксированная точка. Лично я руководствуюсь критерием минимальных перемещений выводимого числа, т.к. все числовые поля должны привлекать одинаковое количество внимания оператора. С этой точки зрения, сколько цифр заложено, столько и вывожу, как правило, и ноль или другая цифра - пофиг. Формат- священная корова  Исключения - имхо, если меняются не числа в фиксированных полях, а целые экраны. Тогда, ессно, пробелы вместо нулей обязательны.
|
|
|
|
Сообщений в этой теме
sKWO Гашение незначащих нулей Aug 31 2008, 10:55 alux Цитата(sKWO @ Aug 31 2008, 13:55) Дабы на... Aug 31 2008, 12:39 Павлик я просто сравниваю число , и если оно равняется 0х... Aug 31 2008, 13:26 zltigo Цитата(Павлик @ Aug 31 2008, 15:26) ...ес... Aug 31 2008, 13:45  rezident Цитата(zltigo @ Aug 31 2008, 19:45) Здоро... Aug 31 2008, 15:14   zltigo Цитата(rezident @ Aug 31 2008, 17:14) Как... Aug 31 2008, 15:20 aesok Цитата(sKWO @ Aug 31 2008, 14:55) Какой а... Aug 31 2008, 13:31 Aesthete Animus Ну а кто запрещает пользоваться стандартной snprin... Aug 31 2008, 14:09 aaarrr Цитата(Aesthete Animus @ Aug 31 2008, 18... Aug 31 2008, 14:11 Rst7 Ох, что-то, вы, господа, мрачно тут начали, делени... Aug 31 2008, 15:41 sKWO Цитата(Rst7 @ Aug 31 2008, 19:41) Ох, что... Jul 7 2013, 11:55 Павлик Я тут спорить не собираюсь , сам начинающий и мног... Aug 31 2008, 15:43 zltigo Цитата(Павлик @ Aug 31 2008, 17:43) Предл... Aug 31 2008, 16:22 defunct Код// convert and output decimal value
int IntToSt... Aug 31 2008, 18:00 ReAl Ну и до кучи - чтобы все варианты были и чтобы был... Aug 31 2008, 20:08 777777 У меня сделано два отдельных преобразования: целое... Sep 1 2008, 13:01 rx3apf Какие-то все жутковатые алгоритмы... Я вот всю жиз... Jul 7 2013, 12:19 toweroff Цитата(rx3apf @ Jul 7 2013, 16:19) заменя... Jul 7 2013, 13:33 V.K Никогда не думал, что подобные вопросы могут быть ... Jul 7 2013, 13:50 sKWO Цитата(V.K @ Jul 7 2013, 17:50) Никогда н... Jul 7 2013, 14:21 zöner вот тут неплохо разжованы разные алгоритмы преобра... Jul 7 2013, 19:33 Rst7 QUOTE (sKWO @ Jul 7 2013, 14:55) Чисто из... Jul 8 2013, 07:42 sKWO Цитата(Rst7 @ Jul 8 2013, 11:42) Ничего у... Jul 8 2013, 10:03
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|