我需要一个以两个参数作为输入的函数:0<=a<=1
和0<=b<=1
。
输出是另一个数字c
,也在[0,1]
区间内。 c
必须大于或等于a
和b
。该函数也必须是单调的,因此如果a2>a1
和b2>=b1
,c2
必须大于c1
,则除非c2=c1=1
。
谢谢你们,我自己想出了一个简单的解决方案。只需制作c=a+b-ab
,即可满足所有要求。
答案 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。