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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Регистрация: 24.03.2007
Сообщений: 1,330
Сказал спасибо: 85
Сказали Спасибо 596 раз(а) в 361 сообщении(ях)
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.RU
 
Аватар для AJScorp
 
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
AJScorp на пути к лучшему
По умолчанию Re: арифметические операции

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

f = (float)(n*p)/100;
AJScorp вне форума  
Непрочитано 03.11.2010, 10:10  
RY723
Заблокирован
 
Регистрация: 08.08.2007
Сообщений: 2,843
Сказал спасибо: 378
Сказали Спасибо 1,368 раз(а) в 746 сообщении(ях)
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.RU
 
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
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,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Арифметические операции

А вот с правильным округлением
i=(((unsigned short)n*p+50)/100)
Yurkin2007 вне форума  
Непрочитано 05.11.2010, 13:20  
аtаs_stas
Заблокирован
 
Регистрация: 23.08.2010
Сообщений: 541
Сказал спасибо: 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.RU
 
Регистрация: 24.03.2007
Сообщений: 1,330
Сказал спасибо: 85
Сказали Спасибо 596 раз(а) в 361 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: Арифметические операции

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

Закладки
Опции темы

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

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

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


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot