Математика

Votmax
Offline
Зарегистрирован: 18.06.2016
Добрый день!
Появился глупый вопрос, связанный с вычислениями.
Есть два числа, нужно определить, сколь одно составляет от другого в процентах. Вот кусок кода:
 
 
int n;
int n_num;
float me;
 
me=n/n_num*100;

lcd.print(me,0);

Числа n, n_num порядка 100,200,300...1000

В таком исполнении на экране всегда почему то ноль, но если записать по другому, все считается:

int n;
int n_num;
float me;
 
me=n*100/n_num;

lcd.print(me,0);

Но в этом случае, если n> ~330 , то 330*100>32 767  и расчет идет некорректно.

Как это можно объяснить?

The Kaban
Offline
Зарегистрирован: 28.09.2016

Могу ошибаться, но по идеи нужно делать так:

me = n * 100 / n_num;
kalapanga
Offline
Зарегистрирован: 23.10.2016
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Votmax пишет:

В таком исполнении на экране всегда почему то ноль

А Вы чего ожидали? Приведите пример для конкретных чисел, чего Вы хотели увидеть?

Votmax пишет:

если n> ~330 , то 330*100>32 767  и расчет идет некорректно.

Как это можно объяснить?

Простите, я никак не пойму, что Вам нужно объяснить? Почему 330*100 будет больше, чем 32767? Или что-то другое?

А по вычислениям, ну так напишите вместо 

me=n*100/n_num;

что-нибудь вроде

me=n*100.0/n_num;

и будет море счастья :)

Snubist
Offline
Зарегистрирован: 18.02.2013

Имхо, операции выполняются последовательно.

1 действие 

A=n/n_num

2 действие

me=А*100;

Те же действия по типам

A=int/int 

А будет равен int, тоесть натуральное число, а так как n<n_num то А=0

А вот если вы одну переменную используете float

то 

A=float/int

А будет равен float, то есть дроби.

следовательно надо 

float n;
int n_num;
float me;
 
me=n/n_num*100;

lcd.print(me,0);

 

Votmax
Offline
Зарегистрирован: 18.06.2016

 

Пример.

Предположим, есть два числа: 131 и 150. Нужно узнать, сколько одно составляет от другого в процентах.

В программе:

n=131;

n_num=151;

me=n/n_num*100=131/151*100=86,75% - в теории, а в программе получается 0.

Если считать так:

me=n*100/n_num=131*100/151=86,75%, что вроде бы тоже самое, в программе получаем тоже  86,75.

Теперь, предположим, есть два числа: 356 и 375, оставляем вторую, рабочую, формулу:

me=n*100/n_num=356*100/375=94,93% - это в теории, в контроллере получается: минус 75.

Как я понимаю, это связано с тем, что 356*100=35600, что выходит за диапазон типа int (-32 768 до 32 767).

 

Вот такие вот дела. Как думаете, с чем это связано (0) и как все таки правильно считать?

 

 

 

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Votmax пишет:
как все таки правильно считать?

Я Вам неписал это в посте #3. Вас что-то не устраивает? Или неправильно считает?

На остальные вопросы, сейчас по мере возможности отвечу.
Votmax
Offline
Зарегистрирован: 18.06.2016

Snubist пишет:

 

....А вот если вы одну переменную используете float

то 

A=float/int

А будет равен float, то есть дроби.

следовательно надо 

float n;
int n_num;
float me;
 
me=n/n_num*100;

lcd.print(me,0);

 

Спасибо, получилось!!!

Я почему то думал, что если использую вещественную переменную и в нее записываю результат от деления двух целых, то должно прокатить... ан нет)

Votmax
Offline
Зарегистрирован: 18.06.2016

ЕвгенийП пишет:

 Или неправильно считает?

 
Ну да, int*100 может выйти за диапазон значений, если int>327.
 
Но вроде бы получилось, так что всем большое спасибо!
Snubist
Offline
Зарегистрирован: 18.02.2013

Вопрос если вы смотрите с точки математики, то зачем вам контроллер?

А если вы смотрите с точки зрения контроллера, то в вашем примере 131/151=0 так как оба числа int,  и ответ будет в int. А он натуральное (не дробное число)

А вот если контроллеру дать, 131,0/151 то есть одно число float (обзову его дробью), а второе int то ответ131,0/151= 0,8675..... так как результате контроллер (интерпретатор) поймет что мы работаем с запятой, а не с целыми числами.

Votmax
Offline
Зарегистрирован: 18.06.2016

Беру на заметку, спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Votmax пишет:

Предположим, есть два числа: 131 и 150. 

n=131;
n_num=151;
me=n/n_num*100=131/151*100=86,75% - в теории, а в программе получается 0.

Вы очень плохо знаете теорию. В теории операции выполняются слева направо. Самая первая операция - 131 / 151 равно 0! Ну, а 0 умноженный на 100, тоже, разумеется даёт 0.

Votmax пишет:

me=n*100/n_num=356*100/375=94,93% - это в теории, в контроллере получается: минус 75.

Как я понимаю, это связано с тем, что 356*100=35600, что выходит за диапазон типа int (-32 768 до 32 767).

Ну, правильно, переполнение никто не отменял.

Votmax пишет:

Как думаете, с чем это связано

Думаю, что это связано с тем, что Вы уже скоро два года как интересуетесь ардуион и до сих пор не удосужились прочитать ни одной, даже самой простенькой книжки по программированию. Я не говорю, про нормальные профессиональные  книги, ну, хотя бы что-то вроде вот этого - это книжка написана для уж совсем идиотов.

Если Вы из тех, кто считает, что изучать ничего не нужно, т.к. ардуино - платформа для домохозяек и неучей, продолжайте в том же духе, а если нет, то прочитайте-таки наконец и найдите ответ почему у Вас не работало.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Votmax пишет:

Ну да, int*100 может выйти за диапазон значений, если int>327.

Ещё одно подтверждение, что Вы ничерта никогда не читали.

Это У ВАС было  int*100! А у меня было -  int*100.0

Вы разницы совсем не видите?

Почитайте что-нибудь, иначе так и будете детские вопросы задавать.

Votmax
Offline
Зарегистрирован: 18.06.2016

ЕвгенийП пишет:

 

Думаю, что это связано с тем, что Вы уже скоро два года как интересуетесь ардуион и до сих пор не удосужились прочитать ни одной, даже самой простенькой книжки по программированию. Я не говорю, про нормальные профессиональные  книги, ну, хотя бы что-то вроде вот этого - это книжка написана для уж совсем идиотов.

Если Вы из тех, кто считает, что изучать ничего не нужно, т.к. ардуино - платформа для домохозяек и неучей, продолжайте в том же духе, а если нет, то прочитайте-таки наконец и найдите ответ почему у Вас не работало.

 

 

Ну все, понеслась)))

Да вы мега мозг, но не злоупотребляйте..... Именно такие ответы отваживают от форумов, не нужно поучать. Вы обо мне ничего не знаете, а решаете только по записи регистрации на форуме???!!! Думаете я каждый день программирую, думаете я учился на программиста? Это мое хобби, а хобби я занимаюсь, когда есть на это время. Может я и плохо знаю среду, но от этого лично мой проект не страдает, а запускать в космос ракеты я не собираюсь)))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Никуда ничего не неслось.

Вы спросили "почему так?" - Вам ответили почему. Только ответ Вам не понравился, но это Ваша проблема. Более того, Вам был дан дельный совет со ссылками на книги, которые необходимо прочитать, если это действительно

Votmax пишет:
Это мое хобби

Разумеется, вместо благодарности за хороший совет ... как всегда.

Нельзя вообще ничего не знать о своём хобби, а тут как раз такой случай - Вы не знаете самых элементарных вещей. И, насколько я понял из ответа, узнавать не намерены. Дело Ваше. Удачи!

Votmax
Offline
Зарегистрирован: 18.06.2016

ЕвгенийП пишет:

 

Вы спросили "почему так?" - Вам ответили почему. Только ответ Вам не понравился, но это Ваша проблема. 

Разумеется, вместо благодарности за хороший совет ... как всегда.

 

См. выше, я поблагодарил всех, кто ответил, причину своих неудач я понял. Не нравятся ваши нравоучения, типа "почитай книжку для уж совсем идиотов" и "Почитайте что-нибудь, иначе так и будете детские вопросы задавать." А вот интересно в чем суть форумов? Я думал, как раз для того, чтобы и задавать вопросы... А если все будут все знать, так форумы никто и посещать не будет... Вот кому вы тогда будете отвечать и кого будете поучать?

Я на форуме http://vbnet.ru зарегистрирован вообще лет 15 назад))) Жалко, что им сейчас мало кто пользуется, наверное, по вашей логике, все уже все прочитали и узнали)). Но до сих пор у меня появляются "глупые" вопросы и это нормально!

А когда все знаешь, это ведь скучно).

Еще раз спасибо за ответы! 

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Votmax пишет:
А вот интересно в чем суть форумов? Я думал, как раз для того, чтобы и задавать вопросы...

Вы ошиблись. Вы перепутали форум со школой. Это школа нужна для обучения тех, кто ничего не знает.

А форум нужен для общения людей со схожими интересами - людей, которым интересно обсуждать какую-то тематику, а вовсе не обучения тех, кто 1) в этой тематике не знает ничего; и 2) не желает учиться, т.к. всегда можно спросить и все обязаны ответить.

Если понять, что форум - это место общения по интересам, то нетрудно будет продолжить эту мысль - с людьми, которые в тематике форума не разбираются от слова совсем, общаться неинтересно. Подумайте.

Votmax
Offline
Зарегистрирован: 18.06.2016

ЕвгенийП пишет:

А форум нужен для общения людей со схожими интересами - людей, которым интересно обсуждать какую-то тематику, а вовсе не обучения тех, кто 1) в этой тематике не знает ничего; и 2) не желает учиться, т.к. всегда можно спросить и все обязаны ответить.

Как вас тянет то пообсуждать кого то. Прямо остановится не можете...  И главное переходите на личности...это противно.Вот из за таких как вы лишний раз и не хочется пользоваться форумами....

Не хотите отвечать, ну не отвечайте, закройте топик, нет, думаете: напишу еще одному, что он ничего не знает, кину ему ссылку на книгу, мол я такой начитанный, а вы все тут даже недостойны находится...

С вашими тараканами вам прямая дорога на форум isterichki.net. 

 

Тема закрыта.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Как понесло человека-то! А ведь всего-то, ему

1) исправили код, так что он заработал;
2) посоветовали, что почитать, чтобы впредь дураком не выглядеть.

Но последнее было напрасно - покушения на святое право быть идиотом мы никому не прощаем :)))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Женя, ну солидный же человек! Известно, что куда новичка не целуй, у него везде жопа.

Так что лучший вариант - сразу глумиться, как я или Клапауций. Эти новички никому и никогда не принесут пользы. И, если они в рыданиях покинут форум -  только чище станет. Достойный совета человек обычно виден сразу.

Вышесказанное - ни в коем случае не совет - просто мнение.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

Votmax пишет:

Именно такие ответы отваживают от форумов мамкиных плакс.

О_О