修改对数曲线上的值

时间:2015-01-30 18:17:13

标签: 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 ++中会是什么样子?

2 个答案:

答案 0 :(得分:2)

听起来你想要这个:

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

我假设你有自然对数函数ln和常量e。乘以x的数字是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

答案 1 :(得分:1)

我们可以尝试以下假设:我们需要一个函数f(y),使得f(0)= 0和f(1)= 1遵循一些对数曲线,可能类似于f(y)= A log(B + C y),确定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)