добавление / вычитание чисел с плавающей запятой / int Linux - PullRequest
0 голосов
/ 04 марта 2012

(можете пропустить эту часть только объяснение кода ниже. Мои проблемы находятся под блоком кода.)

привет. Я пытаюсь использовать циклы дросселирования, основываясь на том, какую полосу пропускания использует компьютер Linux. я читаю / proc / net / dev раз в секунду и отслеживаю байты, передаваемые в 2 переменных. один - последний раз, когда он был проверен, другой - последний раз. оттуда вычитает последний из последнего, чтобы вычислить, сколько байтов было отправлено за 1 секунду.

оттуда у меня есть переменные max_throttle, throttle, max_speed и sleepp.

Идея состоит в том, чтобы увеличить или уменьшить sleepp в зависимости от используемой полосы пропускания. чем меньше пропускная способность, тем меньше задержка и чем больше, тем дольше.

У меня сейчас проблемы с плавающими и целыми числами. если я устанавливаю все мои переменные в ints, max_throttle становится 0 всегда, независимо от того, что я устанавливаю для других, и даже если я их инициализирую.

также, хотя в моем операторе if говорится: «если sleepp меньше, чем 0, верните его в 0», оно все глубже и глубже проникает в негативы, а затем выравнивается на уровне -540 с использованием 0 пропускной способности.

и if (ii & 0x40) для контроля скорости и использования. в моем приложении не будет спящего режима в течение 1 секунды, поэтому этот код позволяет ограничить изменение sleepp примерно каждые 20-30 итераций. хотя у меня также есть проблема, связанная с тем, что после двухкратных итераций, когда он запускается, он продолжает запускать каждую итерацию после того, как вместо того, чтобы быть истинным только один раз, а затем снова быть истинным после еще 20-30 итераций.

edit :: более простое приведение тестов к моей переменной.

#include <stdio.h>

int main()
{
int max_t, max_s, throttle;

      max_s = 400;
      throttle = 90;
      max_t = max_s * (throttle / 100);
      printf("max throttle:%d\n", max_t);


return 0;
}

Ответы [ 2 ]

4 голосов
/ 04 марта 2012

В C оператор / является целочисленным делением, когда используется только с целыми числами. Следовательно, 90/100 = 0. Чтобы выполнить деление с плавающей запятой с целыми числами, сначала преобразуйте их в числа с плавающей запятой (или двойные или другие типы fp).

max_t = max_s * (int)(((float)throttle / 100.0)+0.5);

+0,5 округляется перед преобразованием в int. Возможно, вы захотите рассмотреть некоторые стандартные функции напольного покрытия, я не знаю ваш вариант использования.

Также обратите внимание, что 100.0 является литералом с плавающей точкой, тогда как 100 будет целочисленным литералом. Так что, хотя они кажутся идентичными, они не являются.

1 голос
/ 05 марта 2012

Как указал Кралик, целочисленное деление C на 90/100 равно 0.Но вместо использования чисел с плавающей точкой вы можете работать с целыми числами… Просто делите после умножения (обратите внимание на отсутствие скобок):

max_t = max_s * throttle / 100;

Это дает вам общее представление.Например, если вы хотите указать тип округления кралика, добавьте 50 перед делением:

max_t = (max_s * throttle + 50) / 100;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...