Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 10.07.2019, 20:07   #1
Руслан
Senior Member
 
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0
Руслан will become famous soon enough
По умолчанию преобразование дробного к целому

Всем привет!

Делаю следующие операции и не понимаю почему такой результат. Пример ниже.


Код:
	int nRes = 0;
        nRes = 2.5; //в результате nRes = 2 (все нормально)
	nRes = (500/1000)*100; //в результате nRes = 0  (не понятно)
	nRes = 500*100/1000; //в результате nRes = -15 (не понятно)
Преобразование типа nRes = (int)(500*100/1000) не помогает.

среда:
MPLAB IDE 7.20.00

компилятор:
HI-TECH PICC-18 Release Notes for
Version 8.35PL3

Заранее благодарен!
Руслан вне форума   Ответить с цитированием
Старый 10.07.2019, 20:19   #2
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 819
Вес репутации: 1473/56
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: преобразование дробного к целому

Цитата:
Сообщение от Руслан Посмотреть сообщение
Преобразование типа nRes = (int)(500*100/1000) не помогает.
!
nRes = (500L*100)/1000
DmitrijVDN вне форума   Ответить с цитированием
Старый 10.07.2019, 20:28   #3
Руслан
Senior Member
 
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0
Руслан will become famous soon enough
По умолчанию Re: преобразование дробного к целому

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
nRes = (500L*100)/1000
а что означает это "L" и по каким правилам его ставить - у меня есть другие подобные вычисления, я привел только пример. Спасибо.
Руслан вне форума   Ответить с цитированием
Старый 10.07.2019, 20:44   #4
vladtv
Senior Member
 
Регистрация: 27.02.2007
Сообщений: 135
Вес репутации: 100/48
vladtv will become famous soon enoughvladtv will become famous soon enough
По умолчанию Re: преобразование дробного к целому

Когда происходит умножение
Цитата:
Сообщение от Руслан Посмотреть сообщение
Код:
    500*100
в четвертой строке, "переполняется" двухбайтовый int (max 32767) и число становится отрицательным. Объявите как unsigned int и в этом месте переполнения не будет.
vladtv вне форума   Ответить с цитированием
Старый 10.07.2019, 22:50   #5
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 819
Вес репутации: 1473/56
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: преобразование дробного к целому

Цитата:
Сообщение от Руслан Посмотреть сообщение
а что означает это "L" и по каким правилам его ставить - у меня есть другие подобные вычисления, я привел только пример. Спасибо.
https://cpp.com.ru/shildt_spr_po_c/02/0209.html
DmitrijVDN вне форума   Ответить с цитированием
Старый 15.07.2019, 15:44   #6
Sergey K
Senior Member
 
Регистрация: 23.10.2008
Адрес: Киев
Возраст: 36
Сообщений: 278
Вес репутации: 422/46
Sergey K is just really niceSergey K is just really niceSergey K is just really niceSergey K is just really niceSergey K is just really nice
По умолчанию Re: преобразование дробного к целому

Цитата:
Сообщение от Руслан Посмотреть сообщение
nRes = (500/1000)*100;
Если все привести к int, то промежуточный результат выполнения "(500/1000)" будет "0". Тут уже на усмотрение компилятора, как он заоптимизирует это.
Дабы избежать недопонимания моей идеи со стороны компилятора, я иногда пишу так:
nRes = (float)((500/1000)*100);
или даже:
nRes = (float)((500.0/1000.0)*100.0);
Sergey K вне форума   Ответить с цитированием
Старый 17.07.2019, 09:39   #7
Руслан
Senior Member
 
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0
Руслан will become famous soon enough
По умолчанию Re: преобразование дробного к целому

сделал вот так, вроде работает, но терзают сомнения

Код:
	double dRes_AD; //значение может быть от 0.1 до 3.5 (считано с АЦП вольты) 
	unsigned int unValt = 0;
	unsigned int unRes = 0;
	double dRes_tmp = 0;
	double d_tmp_TDS = 0; 
	
	un_temperature = (int)c_temperature;

	unValt = dRes_AD * 1000; 

	if( (unValt > 0) && (unValt < 1000) ) 
	{
       dRes_tmp = unValt * 100L/1000L;  
	}
	else if((unValt >= 1000) && (unValt < 4000)) 
	{
       dRes_tmp = unValt * 240L/1000L;
	}

	
	if( (un_temperature >= 0) && (un_temperature <= 2))
	{
       d_tmp_TDS = dRes_tmp * 1.9; 
	}
	else
	{
	   d_tmp_TDS = dRes_tmp * 0.5; 
	}

	unRes = d_tmp_TDS;
Руслан вне форума   Ответить с цитированием
Старый 17.07.2019, 17:35   #8
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 819
Вес репутации: 1473/56
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: преобразование дробного к целому

жуть какая... хотя, если память резиновая можно и так.
вы уверены что для значения АЦП и темповских
переменных нужны переменные длинной 64бита???
и еще глупый вопрос напряжение с АЦП обязательно было получать в дробных числах ?
DmitrijVDN вне форума   Ответить с цитированием
Старый 18.07.2019, 09:55   #9
Руслан
Senior Member
 
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0
Руслан will become famous soon enough
По умолчанию Re: преобразование дробного к целому

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
вы уверены что для значения АЦП и темповских
переменных нужны переменные длинной 64бита???
Почему 64? unsigned int это 2 байта = 16 бит
double это 3 байта
Неужели я ошибаюсь?

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
напряжение с АЦП обязательно было получать в дробных числах ?
мне так удобней логику писать
Руслан вне форума   Ответить с цитированием
Старый 18.07.2019, 10:22   #10
bzx
Senior Member
 
Аватар для bzx
 
Регистрация: 25.02.2007
Адрес: St. Petersburg
Возраст: 46
Сообщений: 495
Вес репутации: 1159/61
bzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud of
Отправить сообщение для bzx с помощью ICQ Отправить сообщение для bzx с помощью Skype™
По умолчанию Re: преобразование дробного к целому

Цитата:
Сообщение от Руслан Посмотреть сообщение
...unsigned int это 2 байта = 16 бит
...double это 3 байта...
Сделайте sizeof(double) и Вы удивитесь!
__________________
Для связи email: info собака qbit.su
bzx вне форума   Ответить с цитированием
Старый 18.07.2019, 10:27   #11
bzx
Senior Member
 
Аватар для bzx
 
Регистрация: 25.02.2007
Адрес: St. Petersburg
Возраст: 46
Сообщений: 495
Вес репутации: 1159/61
bzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud of
Отправить сообщение для bzx с помощью ICQ Отправить сообщение для bzx с помощью Skype™
По умолчанию Re: преобразование дробного к целому

Цитата:
Сообщение от Sergey K Посмотреть сообщение
...промежуточный результат выполнения "(500/1000)" будет "0"...
Да, так. Но если поставить в конце любого числа точку, то будет не ноль.
Код:
(500./1000)
nRes = (float)((500/1000)*100); - будет "0"
__________________
Для связи email: info собака qbit.su
bzx вне форума   Ответить с цитированием
Старый 18.07.2019, 11:09   #12
Руслан
Senior Member
 
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0
Руслан will become famous soon enough
По умолчанию Re: преобразование дробного к целому

длины то такое - памяти хватает пока, вопрос главный - не пропустил ли я где-то возможное переполнение и "перекручивание" значения переменной из-за чего будет неверно работать прога - это критично, о чем я писал изначально в этом посте.
Руслан вне форума   Ответить с цитированием
Старый 18.07.2019, 22:09   #13
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 819
Вес репутации: 1473/56
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: преобразование дробного к целому

Цитата:
Сообщение от Руслан Посмотреть сообщение
Почему 64? unsigned int это 2 байта = 16 бит
double это 3 байта
Неужели я ошибаюсь?


мне так удобней логику писать
еще как ошибаетесь... https://cpp.com.ru/shildt_spr_po_c/02/0201.html
это глупо и стопроцентно не удобней.
вы получаете данные с АЦП в попугаях размерность 10бит, все это прекрасно помешается в 16 бит

для проги 0,100..3,500в это тоже попугаи, не чем отличающиеся от 100..3500 за одним исключением первые требуют разрядность 32бит , вторые 16бит (со всеми вытекающими прелестями потери памяти и быстродействия кода ) , а точка нужна только на моменте вывода попугаев на человекоинтерфейс
DmitrijVDN вне форума   Ответить с цитированием
Старый 19.07.2019, 09:52   #14
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,852
Вес репутации: 5553/169
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: преобразование дробного к целому

Цитата:
Сообщение от Руслан Посмотреть сообщение
мне так удобней логику писать
с точки зрения той же физики, почему не работать в тех же милливольтах? с умножениями не выйдете за стандартный long, хотя возможно и надо будет делать в несколько присестов.

там эта маленькая точка тянет за собой весьма и весьма. Причем очень скоро выяснится, что и float не хватает, надо double...
Greg вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование систем счисления и вывод на экран. Lum1noFor Вопросы начинающих 13 04.11.2015 19:56
Обратное преобразование Фурье в MikroC for dsPIC alldn Вопросы начинающих 3 05.06.2013 11:02
Преобразование DC в DC по таблице. Artyuha Вопросы начинающих 224 15.08.2010 10:19
Преобразование 8битного двоично-десятичного кода в 5битный двоичный Vadim_ya Вопросы начинающих 17 15.01.2010 21:56
DsPIC Деление целого 32 битного числа на 32 битное с получением дробного результата kotlyara Продукция MICROCHIP 4 01.10.2007 10:46


Часовой пояс GMT +3, время: 11:42.


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