Большой Воронежский Форум
» Программирование>Работа с long и float - в упор не вижу ошибку.
-=Женек=- 22:53 02.06.2010
Господа, есть 3 числа 16-ричных. Их "склеивание" дает число типа unsigned long.
Это число означает количество шагов частоты, известен так же шаг перестройки частоты - 396. Вычисляем итоговое число, умножая количество шагов на размер шага. При изменении младшего байта FREQ0 на единицу конечная величина должна меняться на 396. ОДнако когда я запускаю в работу мой код, шаг почему-то получается 512.

Код:
unsigned long FREQ;
float FREQUENCY;


//FREQ=((FREQ2<<16)|(FREQ1<<8)|(FREQ0));
FREQ=FREQ2*65536+FREQ1*256+FREQ0-1;  // -1 - это манипуляция с количеством шагов.
FREQUENCY=(float)FREQ/1000000*396;


lcd_set_rect(lcd_window, 0, 40, 239, 55);		
  	    lcd_set_colors(RED, BLACK);					
    	  sprintf(str,"Частота %f МГц",FREQUENCY);
		 lcd_print(str, L_ALIGNED, NO_TRANSPARENCY);
Собственно формула:
Fcarrier=Fxosc/2^16 * FREQ[23:0]
Fxosc = 26 000 000, шаг при этом равен Fxosc/2^16 и должен быть 396

Чувствую что где-то ошибся с приведением типов.... ПОдскажите. [Ответ]
Part!zan 23:45 02.06.2010
-=Женек=-, а смысл использовать float вместо ulong? Те же 4 байта. Сначала умножай на 396, а потом уже дели. Т.к. пределы для FREQ0..FREQ2 ты не указал, то подозреваю, что итоговое FREQ не влезает в мантиссу float. [Ответ]
-=Женек=- 05:29 03.06.2010
FREQ0..FREQ2 - байты. Предел - 255.
float - для того чтобы получившиеся герцы перевести в мегагерцы.
А получаться должно 4-значное число с 6 знаками после запятой. [Ответ]
cfyx 12:08 03.06.2010
4-значное число с 6 знаками после запятой - это не ко float. там мантисса - 7 цифр. [Ответ]
Part!zan 19:31 03.06.2010
-=Женек=-, похоже, я недостаточно ясно объяснил... Что у тебя получится в результате ((255<<16)|(255<<8)|255-1)? Восьмизначное число, а это не влезет в мантиссу float. Так что, либо используй double, либо целочисленную арифметику осваивай. [Ответ]
dr.ON 21:25 04.06.2010
изващение но должно работать

Код:
unsigned long FREQ;

unsigned long FREQUENCY; // in 2Hz


FREQ=FREQ2*65536+FREQ1*256+FREQ0-1;  // -1 - это манипуляция с количеством шагов.
FREQUENCY= FREQ*( 396/2); // in 2Hz  делим на 2 чтобы влезть в динамический диаппазон unsigned long


 sprintf(str,"Частота %d.%06d МГц", ( FREQUENCY / ( 1000000L / 2L)), ( ( FREQUENCY % ( 1000000L / 2L))*2L));
P.S. на армах вроде уже long long должны быть
Кстати есть у меня подозрение что во FREQ2 значащих бит меньше 8ми, а следовательно деление на 2 можно убрать. [Ответ]
-=Женек=- 22:03 04.06.2010
На самом деле помогло использование double.

Сообщение от :
FREQUENCY=(double)(((FREQ2<<16)|(FREQ1<<8)|(FREQ0) )*26)/65536;

lcd_set_rect(lcd_window, 0, 40, 239, 55);
lcd_set_colors(RED, BLACK);
sprintf(str,"Частота %f МГц",FREQUENCY);
lcd_print(str, L_ALIGNED, NO_TRANSPARENCY);

[Ответ]
Spectator 12:39 10.06.2010

Сообщение от -=Женек=-:
На самом деле помогло использование double.

Спасло на конкретных значениях, просто вместимость double больше чем float)))) Намного больше, но разрабатывать алгоритм не понимая и не учитывая вместимости переменных - это до добра не доведет)) [Ответ]
Part!zan 19:28 10.06.2010
Spectator, у тебя есть регулятор апломба или он давно сломался, заклинив на максимуме? [Ответ]
Spectator 19:40 10.06.2010

Сообщение от Part!zan:
Spectator, у тебя есть регулятор апломба или он давно сломался, заклинив на максимуме?

Заклинило, заклинило. Вот что ты ко мне пристал?))) [Ответ]
Part!zan 19:47 10.06.2010
Spectator, меня раздражают люди с таким гипертрофированным апломбом, вот и пристал. [Ответ]
Вверх