c++ - 修改对数曲线上的值

标签 c++ algorithm logarithm

我有一个值是 0-100 的浮点百分比值,x,另一个值是 0-1 的浮点值,y。随着 y 越来越接近于零,它应该在对数曲线上减小 x 的值。

例如,假设 x = 28.0fy = 0.8f。由于 0.8f1.0f 相差不远,因此它应该只将 x 的值减少一点点,比如将其降低到x = 25.0f 或类似的东西。随着 y 越来越接近于零,它应该越来越大幅度地减少 x 的值。我能想到的唯一方法是使用对数曲线。我知道我想要它做什么,但我终其一生都无法弄清楚如何在 C++ 中实现它。这个算法在 C++ 中会是什么样子?

最佳答案

听起来你想要这个:

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

我假设您有自然对数函数 ln 和常量 ex 的乘积是 y 的对数函数,当 y = 0 时为 0,当 y = 1 时为 1。

这是该函数背后的逻辑(这基本上是一个数学问题,而不是编程问题)。您需要看起来像 ln 函数的东西,首先急剧上升然后趋于平稳。但是你希望它从 (0, 0) 开始,然后经过 (1, 1),而 ln 从 (1, 0) 开始,经过 (e, 1)。这表明在执行 ln 之前,您需要执行一个简单的线性移位,将 0 转换为 1,将 1 转换为 e:((e - 1) * y + 1

关于c++ - 修改对数曲线上的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28242197/

相关文章:

java - 在 Java 的公式中使用 log base 10

c++ - 在使用来自站点的已编译代码构建库时,我无法解决 C++ 中的错误 (LNK2001)

c++ - 在构建库之前选择选项

algorithm - Elo评分系统寻找好资源

algorithm - 这个算法是 O(log log n) 复杂度吗?

java - 具有因变量和对数增量的嵌套循环的时间复杂度

C++:如何在不执行函数的情况下将函数+参数作为参数传递?

c++ - 从 char(不是 char*)到 std::string 的首选转换

c# - 如果不指定容量,将 N 个元素插入 List<T> 的复杂度顺序是什么?

java - 子串计数