Вычисление решения уравнения в C ++ - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть функция в C ++ со следующей подписью:

float Foo(float time, float min, float curr, float beta)

Внутри функции я хочу определить и вернуть MAX в следующем уравнении:

time = beta + (1.0f - beta) * ((MAX - curr) / (MAX - min))

Чтобы проверить результаты, вы можете использовать следующие аргументы:

Foo(0.95f, 625, 800, 0.75f)

Возвращается 1500.


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

0.95 = 0.75 + (1 - 0.75) * ((max - 800) / (max - 625))
0.95 = 0.75 + 0.25 * ((max - 800) / (max - 625))

0.95 - 0.75 = 0.25 * ((max - 800) / (max - 625))
0.2 = 0.25 * ((max - 800) / (max - 625))

0.2 / 0.25 =  (max - 800) / (max - 625)
0.8 = (max - 800) / (max - 625)

0.8 * (max - 625) = max - 800
(0.8 * max) - (0.8 * 625) = max - 800
(0.8 * max) - 500 = max - 800

((0.8 * max) - max) - 500 = -800

((0.8 * max) - max) = -800 + 500
((0.8 * max) - max) = -300

-0.2 * max = -300

max = -300 / -0.2

max = 1500

Ответы [ 2 ]

3 голосов
/ 11 ноября 2010

На бумаге умножьте каждую часть уравнения на (MAX - min), затем перегруппируйте элементы, чтобы получить MAX=some.Бумага и карандаш - это то, что вам обычно нужно, прежде чем писать функции C ++, как в вашем вопросе.

2 голосов
/ 11 ноября 2010
time = beta + (1.0f - beta) * ((MAX - curr) / (MAX - min))

давайте обозначим время с t, бета с b, curr с c, min с m и MAX с x; у нас есть

t = b + (1-b)(x-c)/(x-m)
(x-c)/(x-m) = (t-b)/(1-b)
(x-m)(t-b) = (x-c)(1-b)
x(t-b) - x(1-b) = m(t-b) - c(1-b)
x(t-1) = m(t-b) - c(1-b)
x = (m(t-b) - c(1-b))/(t-1)

так ваша функция будет такой

float Foo(float time, float min, float curr, float beta)
{
   return (min*(time-beta) - curr*(1-beta))/(time-1);
}

Я бы также рекомендовал воздержаться от использования идентификаторов min и time, поскольку они могут вызвать конфликты с std::min и std::time

...