отбросить дробную часть

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

отбросить дробную часть

Сообщение -==MAXCELERON==- »

Приветствую уважаемые)) Давненько не программил и позабыл(( Вобщем проблема в следующем: есть функция delay(), которой необходимо передавать целое число ms, но это число получаем путем умножения числа X на 1.2, в результате получается дробное значение, как его конвертировать то в целое, всю голову сломал уже на такой мелочи ((

Код: Выделить всё

#include <avr/interrupt.h>


#include <avr/wdt.h>
#include <util/delay.h>
#define F_CPU 8000000UL   
volatile int x=1;

void delay(int ms){ 

   for(;ms;ms--)
   
      _delay_ms(1); 
}

int main(void){     //Главная функция
 
  while (1) {

PORTB = 0X01;
delay(x);
x=x*1.2;
PORTB = 0X00;
  
}
}  
Реклама
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Re: отбросить дробную часть

Сообщение zöner »

попробуйте x = ((u32)x * 307) >> 8
Реклама
Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Re: отбросить дробную часть

Сообщение -==MAXCELERON==- »

неа, ошибка( кстати программлю в винавре)
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Re: отбросить дробную часть

Сообщение zöner »

по-вашему что должно получиться если int 1 умножить на 1.2 ?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Re: отбросить дробную часть

Сообщение -==MAXCELERON==- »

1 это так для красоты написал , на самом деле 90 Задача в том, чтобы с каждым циклом задержка увеличивалась в 1,2 раза))
Реклама
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Re: отбросить дробную часть

Сообщение zöner »

неа, ошибка
какая ?
Реклама
Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Re: отбросить дробную часть

Сообщение -==MAXCELERON==- »

error: 'u32' undeclared (first use in this function)
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Re: отбросить дробную часть

Сообщение zöner »

x = (x * 307uL) >> 8
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: отбросить дробную часть

Сообщение GARMIN »

zöner писал(а):(u32)x
Как вы думаете, что автор имел ввиду в этом выражении?
Подсказывать, не значит решать за вас. Читайте раздел "типы данных".
Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Re: отбросить дробную часть

Сообщение -==MAXCELERON==- »

zöner писал(а):x = (x * 307uL) >> 8
Спасибо)) работает) а что за uL??
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Re: отбросить дробную часть

Сообщение zöner »

Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Re: отбросить дробную часть

Сообщение -==MAXCELERON==- »

Ага понятно)) а каков алгоритм получения числа 307?? методом тыка?
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Re: отбросить дробную часть

Сообщение zöner »

x * 1.2 = x * 1.2 * 256 / 256 ~= x * 307 >> 8
Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Re: отбросить дробную часть

Сообщение -==MAXCELERON==- »

Математика проста)) Спасибо за помощь)) пополню копилку знаний)
Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Re: отбросить дробную часть

Сообщение -==MAXCELERON==- »

Господин zöner, прошу прощения за назойливость, а как быть, если требуется наоборот - делить?
Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Re: отбросить дробную часть

Сообщение -==MAXCELERON==- »

Все разобрался сам)) 256/1.2 = 212
nirq
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Re: отбросить дробную часть

Сообщение nirq »

чтобы с каждым циклом задержка увеличивалась в 1,2 раза
Если в начале задержка всегда одинаковая (и состоит из восьми бит) - составляем таблицу:

1
1 * 1.2 = 1.2 = 1
1.2 * 1.2 = 1.44 = 1
1.44 * 1.2 = 1.728 = 1 (если тупо отбросили дробную часть) или 2 (если заморочились с округлением)
...
итого не более чем 256 значений в таблице.

Экономим память? А время не экономим? А округляем в какую сторону?



Делёжка, синусоида, x = x^2 * tg(sqrt(x)) + 14/5...



Если нужна реальная арифметика, а не таблица, потому что нужна РЕАЛЬНАЯ В НАТУРЕ арифметика, а не таблица:

начинаем с единицы, умножаем на 1.2, округляем, получаем единицу, опять умножаем её на 1.2...
ой нет ну конечно единица была для красоты, а на самом деле начальное значение будет равно 90... умножаем... округляем... ну вот так всё ровно же? Сначала?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25277
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: отбросить дробную часть

Сообщение КРАМ »

nirq писал(а): Если нужна реальная арифметика, а не таблица, потому что нужна РЕАЛЬНАЯ В НАТУРЕ арифметика, а не таблица:
начинаем с единицы, умножаем на 1.2, округляем, получаем единицу, опять умножаем её на 1.2...
ой нет ну конечно единица была для красоты, а на самом деле начальное значение будет равно 90... умножаем... округляем... ну вот так всё ровно же? Сначала?
:shock:
Зачем все это?
:))) :))) :)))
Округление нужно ОДНО и для этого нужно сначала получить ВДВОЕ бОльший результат, а затем проанализировать МЛАДШИЙ разряд. Если он =1 (это дробная часть результата = 0,5), то после еще одного сдвига нужно прибавить единицу, а если в этом разряде 0, то после сдвига ничего прибавлять не нужно.
На АСМе это выглядит компактнее.
Достаточно анализа бита переноса ПОСЛЕ получения результата (после сдвига через перенос).
nirq писал(а): Экономим память? А время не экономим?
Никакой практической экономии времени с таблицей не будет.
Адресация таблицы даст примерно такой же расход времени, и к тому же точность однозначно будет ограничена 1 байтом.
nirq
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Re: отбросить дробную часть

Сообщение nirq »

Опять и снова соглашаемся, что х таки да: состоит из 8 бит (хотя это и не принципиально).
Я не знаю, что обозначает int на языке примера в начале, поэтому на всякий случай обозначил явно размер.

Для большей наглядности берём микросхему (восьмибитную и) без аппаратного умножения - например AVR.
Для ещё большей наглядности считаем по формуле более сложной, чем просто "умножить на К либо на 1/К". В общем виде.

Код: Выделить всё

ldi ZH, high(Table * 2)    ; таблица выровнена по 256-байтным границам, старший байт адреса не меняется
ldi ZL, low(Table * 2)

ldi counter, MaxCounter

next:

    lpm temp, Z

    ; do something with temp - желательно не такое пошлое, как / существенно более интеллектуальное, чем "прокрутиться temp раз в пустом цикле"
    ; ... или кому и зачем надо это всё

    inc ZL
    ;brne pc + 2   - не надо
    ;inc ZH

dec counter
brne next
Возвращаемся к формуле "x = x * 1.2", но начинаем с какого-нибудь другого значения - например, с 94 (в общем, опять же, виде).

Без промежуточных округлений в заранее подготовленной таблице было бы:
94 112.8=113 135.36=135 162.432=162 ...

С промежуточными округлениями (до 8 бит) "на лету" получалось бы:
94 113 136 163 ...



Даже если искомый конь так и не перестал быть сугубо сферическим - смысл-то не в коне, а в победе над оппонентом! Восемнадцать кульных смайлов.
Последний раз редактировалось nirq Пн янв 13, 2014 12:07:25, всего редактировалось 1 раз.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25277
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: отбросить дробную часть

Сообщение КРАМ »

nirq писал(а): Для большей наглядности берём микросхему (восьмибитную и) без аппаратного умножения - например AVR.
AVR бывает разная....
И "бОльшая наглядность" в КОНКРЕТНОМ случае не имеет никакого смысла.
:wink:
Как и байтный формат выходных чисел....
:roll: :wink:
Ответить

Вернуться в «AVR»