我有一个值是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 :(得分: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)