Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Арифметические операции

Непрочитано 03.11.2010, 08:01  
yellow87
Вид на жительство
 
Аватар для yellow87
 
Регистрация: 29.04.2007
Адрес: Иркутск
Сообщений: 311
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
yellow87 на пути к лучшему
По умолчанию Арифметические операции

Всем привет!

Научите вычислять процент от одногобайтного числа.
Например, имеем число n (0-255)
И искомый процент P (0-100)
Нужно получить итог i=n*p%

int8 n, p, i;
float f;
n=130;
p=15;
f=n/100*p;
i=f; // должно получиться 19, а получается нуль

PIC16F84A + MPLAB + PICC-CSS
Реклама:

Последний раз редактировалось yellow87; 03.11.2010 в 08:04.
yellow87 вне форума  
Непрочитано 03.11.2010, 08:44  
pambaru
Почётный гражданин KAZUS.RUN
 
Регистрация: 24.03.2007
Сообщений: 1,393
Сказал спасибо: 85
Сказали Спасибо 670 раз(а) в 391 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: арифметические операции

Сообщение от yellow87 Посмотреть сообщение
Всем привет!

f=n/100*p;
i=f; // должно получиться 19, а получается нуль
f=(float)n/100*p;
А быстрее будет работать так:
f=0.01*n*p;
или еще лучше сразу:
i=(word)n*p/100;
pambaru вне форума  
Непрочитано 03.11.2010, 08:46  
AJScorp
Почётный гражданин KAZUS.RUN
 
Аватар для AJScorp
 
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,550
Сказал спасибо: 384
Сказали Спасибо 735 раз(а) в 416 сообщении(ях)
AJScorp на пути к лучшему
По умолчанию Re: арифметические операции

Попробуйте так:

f = (float)(n*p)/100;
AJScorp вне форума  
Непрочитано 03.11.2010, 10:10  
RY723
Заблокирован
 
Регистрация: 08.08.2007
Сообщений: 2,820
Сказал спасибо: 375
Сказали Спасибо 1,364 раз(а) в 744 сообщении(ях)
RY723 на пути к лучшему
По умолчанию Re: Арифметические операции

Сообщение от yellow87 Посмотреть сообщение
f=n/100*p;
i=f; // должно получиться 19, а получается нуль
Не должен получаться нуль.
Должно получится 15.
Т.к. переменные типа int, то остатка не должно быть, поэтому деление 130/100 даёт результат 1, а не 1.3.
И умножение 1*15 даст результат 15.
А вот если, сначала перемножить число и процент
130*15=1950
Делим целое на целое 1950/100=19. Вот так будет правильно.
или так
f = 1950;
f *= 0.01;
Получим резуьтат 19.5
RY723 вне форума  
Непрочитано 03.11.2010, 18:45  
yellow87
Вид на жительство
 
Аватар для yellow87
 
Регистрация: 29.04.2007
Адрес: Иркутск
Сообщений: 311
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
yellow87 на пути к лучшему
По умолчанию Re: Арифметические операции

Всем спасибо!
Попробовал все варианты.
Самым быстрым оказался
i=(int)((float)n*p*0.01);
yellow87 вне форума  
Непрочитано 03.11.2010, 19:17  
OlegNZH
Почётный гражданин KAZUS.RUN
 
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: Арифметические операции

Хм...у Вас же всё равно Целое в Итоге получается, зачем float тогда вмешивать? i=( (word)(n*p) /100 ) (pambaru быстейший вреде подсказал )

Последний раз редактировалось OlegNZH; 03.11.2010 в 19:20.
OlegNZH вне форума  
Непрочитано 05.11.2010, 10:03  
yellow87
Вид на жительство
 
Аватар для yellow87
 
Регистрация: 29.04.2007
Адрес: Иркутск
Сообщений: 311
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
yellow87 на пути к лучшему
По умолчанию Re: Арифметические операции

Мой компилятор не знает word
Поэтому я попробовал
i=((unsigned long int)n*p/100)
Так сработало.
Действительно быстрее! В два раза.
Ещё раз спасибо.
: - )
yellow87 вне форума  
Непрочитано 05.11.2010, 13:16  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Арифметические операции

А вот с правильным округлением
i=(((unsigned short)n*p+50)/100)
Yurkin2007 вне форума  
Непрочитано 05.11.2010, 13:20  
аtаs_stas
Заблокирован
 
Регистрация: 23.08.2010
Сообщений: 540
Сказал спасибо: 20
Сказали Спасибо 93 раз(а) в 78 сообщении(ях)
аtаs_stas на пути к лучшему
По умолчанию Re: Арифметические операции

Здесь немножко разжёвано.

http://www.pic24.ru/doku.php/osa/art...without_errors
аtаs_stas вне форума  
Сказали "Спасибо" аtаs_stas
mike7815 (05.11.2010)
Непрочитано 08.11.2010, 13:00  
pambaru
Почётный гражданин KAZUS.RUN
 
Регистрация: 24.03.2007
Сообщений: 1,393
Сказал спасибо: 85
Сказали Спасибо 670 раз(а) в 391 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: Арифметические операции

Сообщение от yellow87 Посмотреть сообщение
Мой компилятор не знает word
typedef unsigned int word; //для 8-ми битника
pambaru вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

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


Часовой пояс GMT +4, время: 01:07.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.