将数字从1到.0000倍归一化到1 - 0.0X?

时间:2012-04-05 14:17:21

标签: math

我的数字范围为1 - 0.00000X。大多数是小数字,如0.000823。我如何映射它们以使它们更接近范围?我使用了sqrt方法但是还有其他建议吗?

更新

实施例 1-0.1之间的数字我对它们没有问题。我的数字低于0.1的问题。我需要让他们接近0.1。

  • .00004 - > 0.0004或0.004
  • 0.023 - > 0.05或0.09

2 个答案:

答案 0 :(得分:3)

Have you tried logarithms?

如果您的号码满足eps < x <= 1,则函数

y = 1 - C*log(x)其中C = 1/-log(eps)

将数字映射到范围0..1。如果不需要范围,只有数字靠近在一起,则可以删除比例因子。

编辑: 这可以在没有减法的情况下表达。

y = 1 + C*log(x)其中C = 1/log(eps)

例如,如果epsil为0.0000000001(10 ^ -10),则得到C = -0.1并且:

0.0000000001 => 0
0.000000001  => 0.1
0.00000001   => 0.2
...
0.1          => 0.9
1            => 1

编辑:如果您不想更改范围从0.1 ... 1.0但仅更小的数字,则只需将范围从0 ... 0.1缩放。这可以通过在应用函数之前将x乘以10来完成,然后再将10除以10。当然,在这种情况下,只有当值小于0.1时才使用缩放功能。

答案 1 :(得分:0)

嗯,一种简单的方法是计算最小值(例如1-t),然后将段[1-t, 1]重新映射到[0, 1]。映射函数可以是线性的:

xnew = (xold - 1) / t + 1

(当然t = 1 - min value