计算对数百分比

时间:2013-11-04 10:48:27

标签: c# c#-4.0 math logarithm

我有一个监控多个数据点的应用程序,我正在根据线性百分比fading between green, yellow and red执行着色。然而,这并不能准确地将问题可视化,因为数量越大,指数越差。范围是0 - > 30000,我怎样才能产生我认为会被称为对数百分比值而不是线性百分比值?

4 个答案:

答案 0 :(得分:7)

我假设您通过“对数百分比”将数据以对数为基础映射到范围[0,100]。你可以尝试这样的事情:

double Scale(int val)
{
    if (val <= 1)
        return 0; // log is undefined for 0, log(1) = 0
    return 100 * Math.Log(val) / Math.Log(30000);
}

答案 1 :(得分:3)

使用以下形式的功能。

f(x)= s b x / 30000 + t

我们知道0应映射到0%,30000应映射到100%。

f(0)= 0
f(30000)= 100

这些意味着以下方程组。

s + t = 0
s b + t = 100

解决方案(关于b)如下。

s = 100 /(b - 1)
t = -100 /(b - 1)

选择特定的b&gt; 1个值(比如b = 10)。然后你得到以下解决方案。

s = 100/9
t = -100 / 9

即,函数f(x)如下。

f(x)=(100 10 x / 30000 - 100)/ 9

您可以在此处查看此功能的图表:Wolfram Alpha

在C#中,这将如下所示。

double x = ...;

double b = 10.0;
double s = 100.0 / (b - 1);
double t = -100.0 / (b - 1);

double f = s * Math.Pow(b, x / 30000.0) + t;

答案 2 :(得分:1)

改善bmm6o的答案:

public static double Scale(long value, long maxInputValue, long maxOutputValue)
{
    if (value <= 1)
        return 0; // log is undefined for 0, log(1) = 0
    return maxOutputValue * Math.Log(value) / Math.Log(maxInputValue);
}

如果你正在寻找线性和对数之间的东西,以下内容可能有所帮助:

public static double Scale(long value, long maxInputValue, long maxOutputValue, double scaleFactor)
{
    if (value <= 1)
        return 0; // log is undefined for 0, log(1) = 0
    return maxOutputValue * Math.Pow(Math.Log(value), scaleFactor) / Math.Pow(Math.Log(maxInputValue), scaleFactor);
}

答案 3 :(得分:0)

使用Math.Log(double)(或Math.Log(double, double)如果你想玩基数)来获取你的值的对数,你可以映射到一个颜色值。