26.11.2012, 00:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: си - математические выверты..
ах ты ж, для float в printf надо либу линкеру указать..
|
|
|
|
26.11.2012, 00:12
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: си - математические выверты..
Сообщение от whoim
|
ах ты ж, для float в printf надо либу линкеру указать..
|
Может линкеру, может ещё кому...
Вы бы озвучили что у вас за процессор и тулчайн для начала.
|
|
|
|
26.11.2012, 03:03
|
|
Временная регистрация
Регистрация: 18.07.2005
Сообщений: 72
Сказал спасибо: 26
Сказали Спасибо 42 раз(а) в 18 сообщении(ях)
|
Re: си - математические выверты..
Цитата:
|
На горизонте еще задача.. аналог sprintf(_buff, "%01u", _v);
|
Если float и высокая точность не нужна попробуй так
Код:
|
void floatToString( float Value, char* Str, unsigned char fLen)
{
unsigned char bLen;
char* pStr;
int24 tmp_u;
float tmp_d;
//U1 U2 U3 U4 . F1 F2 F3 F4
pStr=Str; //начало U1
if(Value‹0)
{
*Str='-';
++Str; // U2
Value=-Value;
}
tmp_u = (unsigned int)Value;
tmp_d = Value - tmp_u;
IntToString(tmp_u, Str);
//Если есть дробная часть
if(fLen)
{
Str=Str+ strlen(Str);
*Str++='.';
//запоминаем длину дробной части
bLen=fLen;
if(fLen›4) fLen=4; //Чтобы не было переполнения (т.к. int)
if(fLen) tmp_d = tmp_d*Dec[fLen];
tmp_u=(unsigned int)(tmp_d);//(tmp_d+ 0.5)
IntToString(tmp_u, Str);
fLen=strlen(Str);
*(Str+bLen)='\0';
// Число 0.0012; 0.0012*10=0.012 0.0012*100=00.12 0.0012*1000=001.2
// Восстановление потеряных незначащих нулей в целой части (00.12, 001.2)
for(; fLen; --fLen)
{
--bLen;
*(Str+bLen)=*(Str+fLen-1);
}
for(; fLen‹bLen; ++fLen) *(Str+fLen)='0';
}
} |
Если целое то так
Код:
|
char * My_itoa(char * buffer, int i)
{
unsigned int n;
unsigned int neg = 0;
int c;
if (i == 0)
{
buffer[0] = '0';
buffer[1] = '\0';
return buffer;
}
if(i/10000) c=5;
else if(i/1000) c=4;
else if(i/100) c=3;
else if(i/10) c=2;
else c=1;
if (i ‹ 0)
{
neg=1;
c++;
n = -i;
}
else n = i;
buffer[c--] = '\0';
do
{
buffer[c--] = (n % 10) + '0';
n = n / 10;
} while (n);
if (neg) buffer[c--] = '-';
return &buffer[c+1];
} |
|
|
|
Сказали "Спасибо" Taras_33
|
|
|
26.11.2012, 05:56
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: СИ - математические выверты
читаю и плачу. исходная задача (A+B-›AB)
uint32_t twoint_as_long (uint16_t v1, uint16_t v2)
{
uint32_t High = v1, Low = v2;
while (v2) { v2 /= 10; High *= 10; }
return (High + Low);
}
обратная (AB-›A+B) и перевод в строку аналогично, только цикл раскручивается в буфер а не в холостую.
|
|
|
|
26.11.2012, 09:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: СИ - математические выверты
Не так все просто - 1111 0022 даст 111122, а в обратную сторону 11 1122.
тогда уж тупо
uint32_t twoint_as_long (uint16_t v1, uint16_t v2)
{
uint32_t High = v1, Low = v2;
return (High*10000 + Low);
}
Или
uint32_t tab={1,10,100,1000,10000,100000};
uint32_t twoint_as_long (uint16_t v1, uint16_t v2,int n)
{
uint32_t High = v1, Low = v2;
return (High*tab[n] + Low);
}
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
26.11.2012, 10:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: СИ - математические выверты
Сообщение от _Артём_
|
Может линкеру, может ещё кому...
Вы бы озвучили что у вас за процессор и тулчайн для начала.
|
пробегало в первом посте - avrstud6 и xmega32a4
Сообщение от Hives
|
и плачу
|
не плачьте
спасибо, буду реализовывать математику вместо printf и преобразований
хотя.. изначально надо взять из строки (nmea) и вернуть в строку (uart) в виде символов.. все равно надо будет преобразовывать
|
|
|
|
26.11.2012, 11:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: СИ - математические выверты
Сообщение от whoim
|
хотя.. изначально надо взять из строки (nmea) и вернуть в строку (uart) в виде символов.. все равно надо будет преобразовывать
|
NMEA и так дает все в символьном виде (в пакете RMC) - что преобразовывать надо?
|
|
|
|
26.11.2012, 11:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: СИ - математические выверты
Читаю и плачу...
Попробуйте ассемблер...
|
|
|
|
26.11.2012, 11:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: СИ - математические выверты
Boba_spb, необходимо преобразовать координаты в числа (очень очень целое, убираем точку или дробное - мне кажется лучше без дробного обойтись) чтобы передать ряду фильров и корректоров и вернуть назад.
|
|
|
|
26.11.2012, 11:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: СИ - математические выверты
niXto, зачем? у меня и на си получается)
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:18.
|
|