将两个单位间隔数转换为另一个单位间隔数的函数

时间:2014-03-13 11:21:59

标签: algorithm math

我需要一个以两个参数作为输入的函数:0<=a<=10<=b<=1

输出是另一个数字c,也在[0,1]区间内。 c必须大于或等于ab。该函数也必须是单调的,因此如果a2>a1b2>=b1c2必须大于c1,则除非c2=c1=1

谢谢你们,我自己想出了一个简单的解决方案。只需制作c=a+b-ab,即可满足所有要求。

4 个答案:

答案 0 :(得分:1)

由于 a c 始终大于 a b 的要求允许> b 为1.0 c 不能大于此值。

还要求

  

该函数也必须是单调的,所以如果a2&gt; a1和b2&gt; = b1,c2   必须大于c1。

形成不好。这不是多变量函数的单调性的定义。不过,我举一个例子来说明如何实现

  

该函数也必须是单调的,所以如果a2&gt; a1和b2&gt; = b1,c2   必须大于c1(或c = 1.0)。

条件,在函数(3)中。

我假设 c 对两个参数都或等于

(1)

double f( double a, double b) {
  if ( (a == 1.0) || (b == 1.0)) return 1.0;
  return max(a,b) + (1.0 - max(a,b)) / 2;
}

您最终可以指定epsilon以使准确性明确。

(2)

double f( double a, double b, double epsilon) {
  if ( (a == 1.0) || (b == 1.0)) return 1.0;
  return min( 1.0, max(a,b) + epsilon);
}

也满足的功能(措辞单调性差)

  

该函数也必须是单调的,所以如果a2&gt; a1和b2&gt; = b1,c2   必须大于c1。

(3)

double f( double a, double b, double epsilon) {
  if ( (a == 1.0) || (b == 1.0)) return 1.0;
  double distance = 1.0 - max(a,b);
  return 1.0 - distance + max( epsilon, a * distance);
}

答案 1 :(得分:1)

没有这样的功能。对于a=0, b=1,唯一有效的输出为c=1。但是,如果a2=0.5, b2=1,那么唯一有效的输出是c2=1,违反了您的第二个要求。

答案 2 :(得分:0)

要考虑的一个功能是位交错或Morton数。

示例:

 a = 0.1 0 0 1 = 9/16 = 0.5625
 b = 0. 0 1 1 0 = 6/16 = 0.3750
 c = 0.10010110 = 150/256 = 0.5859375   c >= a, c >= b

 a = 1-epsilon = 0.1111111
 b = 1-epsilon = 0.1111111 --> c = 0.11111111 = 1-epsilon

但是 a b 必须排序,即 a &gt; B'/ em>的

答案 3 :(得分:0)

另一个建议:

1-(1-a)(1-b)=a+b-ab=a+b(1-a)=b+a(1-b)

是第一种形式,在[0,1]内,第三种形式大于a,b <1,第四种大于b,a <1。