LINUX.ORG.RU
решено ФорумTalks

Помогите двоечнику с математикой и C

 ,


0

1

Здрасьте. Помогите двоечнику, а то башка совсем ни бум-бум.

Есть две переменных: min_value, max_value. Даже нет, константы. Меняться они будут нечасто.

Есть третья переменная, условно current_value со значением между min_value и max_value.

Как узнать ПРОЦЕНТ, который current_value составляет в промежутке между min_value и max_value ?

Ну вот например, условно говоря, если min_value=200;max_value=400;current_value=300 - то это 50%

Алгоритм можно на любом языке, C, Пацкаль, Пых - пох.

P.S. если кому интересно - делаю датчик уровня топлива ;)

Спасибо :)

★★★★★

Столовая для троллей не пустует?

braboar
()

не проверял

unsigned precentage(unsigned min_value, unsigned max_value, unsigned current_value)
{
    max_value -= min_value;
    current_value -= min_value;
    return current_value * 100 / max_value;
}

reprimand ★★★★★
()

я тебе помогу, если датчик стандартный и ты собрался оцифровать напряжение с него, то имеет точку перегиба :)

Morin ★★★★
()

Давай уточним, если current_value будет равно min_value, то показывать должно 0%? Или min/max*100 %?

Harald ★★★★★
()
Ответ на: комментарий от Morin

Ну вот например, условно говоря, если min_value=200;max_value=400;current_value=300 - то это 50%

((max_value-min_value)/(100))*(current_value - min_value )

(400-200)/100*(300 - 200) = 2 * 100 = 200 /* но не 50% */

Artamudo ★★★★
()
Последнее исправление: Artamudo (всего исправлений: 1)

математика и 1с

Пых - пох

Про такой язык я еще не слышал.

Nervous ★★★★★
()
Ответ на: комментарий от Artamudo

ты мне что пихнуть пытаешься, кто сказал что я был согласен со всем выше написанным :) В свои исправления погляди)))) Ответ правда уже дан чуть выше)))

Morin ★★★★
()
Ответ на: комментарий от Artamudo

В чём проблема сделать по школьной формуле.

(current-min)/(max-min)/100

Не работает. Кусок кода с ардуйни:

 int value=v/20;
  int perc=value/(high_value-low_value)/100;
  display.clearDisplay();
  display.setTextSize(1); 
  display.setTextColor(SSD1306_WHITE); 
  display.setCursor(0,0);
  display.print(low_value);display.print(" ");display.print(value);display.print(" ");display.println(high_value);
  display.setTextSize(2);   
  display.setTextColor(SSD1306_WHITE);  
  display.setCursor(10,15);  
  display.print(perc);display.println(" %");
  display.display();

Результат:

https://sun9-10.userapi.com/c858216/v858216621/177a56/99mGYuiv09M.jpg

UPD. Щас новый вариант попробую :)

windows10 ★★★★★
() автор топика
Последнее исправление: windows10 (всего исправлений: 1)
Ответ на: комментарий от Meyer

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

что поделать - такая жизнь. Можно конечно поизвращаться но я не думаю что ТСу надо 100 показаний в секунду

reprimand ★★★★★
()
Ответ на: комментарий от Meyer

Сдвиги дешевые по скорости

К слову, большинстве случаев свежие компиляторы смогут оптимизировать наивно написанную математику в коде. Вопрос в тому - нужно ли больше? Если нужно - пишут на ассемблере

reprimand ★★★★★
()
Ответ на: комментарий от Meyer

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

Morin ★★★★
()

предлагаю ТС-у включить софтовую эмуляцию FPU

Harald ★★★★★
()

Отвечу сразу всем. Скорость не нужна. Датчик на газовый баллон основан на датчике холла, рядом с которым ерзает магнит.

Даже опрашивая датчик раз в секунду - значения будут плавать в небольшом диапазоне. В пределах 2%-3%, если не больше. Поэтому я опрашиваю датчик 20 раз с промежутком в 0.5 сек, а потом высчитываю среднее арифметическое. Иначе цифра на дисплее будет постоянно прыгать с каждой итерацией.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от BlackJack

((max_value-min_value)/(100))*(current_value - min_value )

  int value=v/20;
  int perc = ((high_value-low_value)/(100))*(value - low_value );
  display.clearDisplay();
  display.setTextSize(1); 
  display.setTextColor(SSD1306_WHITE); 
  display.setCursor(0,0);
  display.print(low_value);display.print(" ");display.print(value);display.print(" ");display.println(high_value);
  display.setTextSize(2);   
  display.setTextColor(SSD1306_WHITE);  
  display.setCursor(10,15);  
  display.print(perc);display.println(" %");
  display.display();

https://sun9-50.userapi.com/c858216/v858216621/177af8/2vcquYn1CXg.jpg

Если ссылка не открывается: минимальное значение 355, максимальное 629, текущее 424. По вашей формуле вышло 138%

windows10 ★★★★★
() автор топика
Ответ на: комментарий от beastie

на AVR операционной системы нет, исключения деления на 0 нет, и даже самого деления нет, поэтому никуда не падаем

Harald ★★★★★
()
Ответ на: комментарий от beastie

угу, а еще можно допилить много-много ненужных проверок например:

1) что min value < max value
2) что при умножении или делении мы вдруг не выйдем за пределы unsigned
3) что current value находится в диапазоне min..max

Но зачем, если ТС не просил? Думаю если у него данные приходят корректные с датчика то и проверки не нужны.

reprimand ★★★★★
()
Ответ на: комментарий от diver

(current_value-min_value)/((max_value-min_value)/100))

  int value=v/20;
  int perc = (value-low_value)/((high_value-low_value)/100);
  display.clearDisplay();
  display.setTextSize(1); 
  display.setTextColor(SSD1306_WHITE); 
  display.setCursor(0,0);
  display.print(low_value);display.print(" ");display.print(value);display.print(" ");display.println(high_value);
  display.setTextSize(2);   
  display.setTextColor(SSD1306_WHITE);  
  display.setCursor(10,15);  
  display.print(perc);display.println(" %");
  display.display();

https://sun9-41.userapi.com/c858216/v858216837/177d1b/Zgoy1IWCUZ8.jpg

Мин: 355, Макс: 629, Текущее: 627. По этой формуле выводится 136%.

windows10 ★★★★★
() автор топика

помогите два раза отнять и один раз поделить 3 числа

34 комментария обсуждения

вот за что я люблю ЛОР

tyakos ★★★
()

анекдот вспоминаю сразу про деда и свечку

zendrz ★★
()
Ответ на: комментарий от Harald

Надо, но зачем-то упорно долю делят на 100, чтобы получить процент о_О

grem ★★★★★
()
Ответ на: комментарий от windows10

Ну ты посмотри, его формула неверная совсем. Там макс минус мин умножается на кур минус мин. А нужно кур минус мин делить на макс минус мин. Ну и на 100 умножить, чтобы в процентах выразить.

turtle_bazon ★★★★★
()
Ответ на: комментарий от Harald

Там значение делится на дробь, делящееся на 100, что значит, что умножается на 100.

turtle_bazon ★★★★★
()

двоечнику

windows10

Чота ржу

TooPar
()
Ответ на: комментарий от windows10

Как выше правильно написали вот так должно быть:

    int perc = 100;
    if (low_value != high_value) {
        perc = ((value - low_value) * 100) / (high_value - low_value);
    }

Сперва умножаешь на 100 а затем делишь, так как это целочисленные значения иначе просто потеряешь значения.

Также проверяешь на то что min и max не равны иначе есть шанс получить деление на ноль.

V1KT0P ★★
()

Есть две переменных: min_value, max_value. Даже нет, константы. Меняться они будут нечасто.

Константы вообще не меняются. Никогда.

peregrine ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.