Изменение значения на логарифмической кривой

У меня есть одно значение, которое представляет собой процент с плавающей запятой от 0 до 100, xи другое значение, которое является плавающей точкой от 0-1, y, Как y становится ближе к нулю, это должно уменьшить значение x на логарифмической кривой.

Так, например, скажем x = 28.0f а также y = 0.8f, поскольку 0.8f не так далеко от 1.0f это должно только уменьшить ценность x на небольшое количество, скажем, сводя его к x = 25.0f или что-то типа того. Как y становится ближе к нулю, это должно все более и более резко уменьшить значение x, Единственный способ, которым я могу думать об этом, — это логарифмическая кривая. Я знаю, что я хочу, чтобы он делал, но я не могу понять, как реализовать это в C ++. Как бы этот алгоритм выглядел в C ++?

0

Решение

Похоже, вы хотите это:

new_x = x * ln((e - 1) * y + 1)

Я предполагаю, что у вас есть функция естественного журнала ln и постоянная e, Число, умноженное на x является логарифмической функцией y который равен 0, когда у = 0 и 1, когда у = 1.

Вот логика этой функции (это в основном математическая проблема, а не проблема программирования). Вы хотите что-то похожее на ln функция, сначала крутой подъем, а затем выравнивание. Но вы хотите, чтобы он начинался с (0, 0), а затем проходил через (1, 1) и ln начинается в (1, 0) и проходит через (е, 1). Это говорит о том, что, прежде чем сделать lnВы делаете простой линейный сдвиг, который занимает от 0 до 1 и от 1 до e: ((e - 1) * y + 1,

2

Другие решения

Мы можем попробовать следующее предположение: нам нужна функция f (y), так что f (0) = 0 и f (1) = 1, которая следует некоторой логарифмической кривой, может быть чем-то вроде f (y) = Aвойти (B + Cy) с константами A, B и C.

f (0) = 0, поэтому B = 1

f (1) = 1, поэтому A = 1 / log (1 + C)

Так что теперь просто нужно найти значение C, чтобы f (0.8) было примерно равно 25/28. Несколько экспериментов показывают, что C = 4 довольно близко. Вы можете найти ближе, если хотите.

Таким образом, одна возможность будет: f (y) = log (1.0 + 4.0 * y) / log (5.0)

1

По вопросам рекламы [email protected]