
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
Работа с long и float - в упор не вижу ошибку.
|
||
| Философия, технологии, алгоритмы! |
![]() |
|
|
Опции темы |
|
|
#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 Чувствую что где-то ошибся с приведением типов.... ПОдскажите. |
|
|
|
|
#2 |
|
Out There
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47
|
-=Женек=-, а смысл использовать float вместо ulong? Те же 4 байта. Сначала умножай на 396, а потом уже дели. Т.к. пределы для FREQ0..FREQ2 ты не указал, то подозреваю, что итоговое FREQ не влезает в мантиссу float.
|
|
|
|
|
#5 |
|
Out There
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47
|
-=Женек=-, похоже, я недостаточно ясно объяснил... Что у тебя получится в результате ((255<<16)|(255<<8)|255-1)? Восьмизначное число, а это не влезет в мантиссу float. Так что, либо используй double, либо целочисленную арифметику осваивай.
|
|
|
|
|
#6 |
|
Форумец
Сообщений: 552
Регистрация: 17.06.2005
Возраст: 42
|
изващение но должно работать
Код:
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)); Кстати есть у меня подозрение что во FREQ2 значащих бит меньше 8ми, а следовательно деление на 2 можно убрать. Последний раз редактировалось dr.ON; 04.06.2010 в 21:44. |
|
|
|
|
#7 | |
|
///
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45
|
На самом деле помогло использование double.
Цитата:
|
|
|
|
|
|
#8 |
|
Форумец
Сообщений: 44,625
Регистрация: 27.05.2003
Возраст: 48
|
|
|
|