Большой Воронежский Форум

Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел.
Вернуться   Большой Воронежский Форум » Компьютеры и все, что с ними связано » » Программирование
Философия, технологии, алгоритмы!

Ответ
 
Опции темы
Старый 02.06.2010, 22:53   #1   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Работа с long и float - в упор не вижу ошибку.

Господа, есть 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

Чувствую что где-то ошибся с приведением типов.... ПОдскажите.
  Ответить с цитированием
Старый 02.06.2010, 23:45   #2   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
-=Женек=-, а смысл использовать float вместо ulong? Те же 4 байта. Сначала умножай на 396, а потом уже дели. Т.к. пределы для FREQ0..FREQ2 ты не указал, то подозреваю, что итоговое FREQ не влезает в мантиссу float.
  Ответить с цитированием
Старый 03.06.2010, 05:29   #3   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
FREQ0..FREQ2 - байты. Предел - 255.
float - для того чтобы получившиеся герцы перевести в мегагерцы.
А получаться должно 4-значное число с 6 знаками после запятой.
  Ответить с цитированием
Старый 03.06.2010, 12:08   #4   
нищеброд
 
Аватар для cfyx
 
Сообщений: 78
Регистрация: 31.05.2007
Возраст: 45

cfyx вне форума Не в сети
4-значное число с 6 знаками после запятой - это не ко float. там мантисса - 7 цифр.
  Ответить с цитированием
Старый 03.06.2010, 19:31   #5   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
-=Женек=-, похоже, я недостаточно ясно объяснил... Что у тебя получится в результате ((255<<16)|(255<<8)|255-1)? Восьмизначное число, а это не влезет в мантиссу float. Так что, либо используй double, либо целочисленную арифметику осваивай.
  Ответить с цитированием
Старый 04.06.2010, 21:25   #6   
Форумец
 
Сообщений: 552
Регистрация: 17.06.2005
Возраст: 42

dr.ON вне форума Не в сети
изващение но должно работать

Код:
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 можно убрать.

Последний раз редактировалось dr.ON; 04.06.2010 в 21:44.
  Ответить с цитированием
Старый 04.06.2010, 22:03   #7   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
На самом деле помогло использование 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);
  Ответить с цитированием
Старый 10.06.2010, 12:39   #8   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,625
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
На самом деле помогло использование double.
Спасло на конкретных значениях, просто вместимость double больше чем float)))) Намного больше, но разрабатывать алгоритм не понимая и не учитывая вместимости переменных - это до добра не доведет))
  Ответить с цитированием
Старый 10.06.2010, 19:28   #9   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
Spectator, у тебя есть регулятор апломба или он давно сломался, заклинив на максимуме?
  Ответить с цитированием
Старый 10.06.2010, 19:40   #10   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,625
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
Цитата:
Сообщение от Part!zan Посмотреть сообщение
Spectator, у тебя есть регулятор апломба или он давно сломался, заклинив на максимуме?
Заклинило, заклинило. Вот что ты ко мне пристал?)))
  Ответить с цитированием
Старый 10.06.2010, 19:47   #11   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
Spectator, меня раздражают люди с таким гипертрофированным апломбом, вот и пристал.
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind