计算对数时的delta值
delta value while calculating logarithm
我正在使用公式来计算参数,该公式涉及对有时可能为零的值取对数。为了处理这种情况,我在文献中阅读了如下技术来放置一些增量值:
ln(delta + A)
这里的参数A
是一个实数,取值范围是[0, 1]
。
我应该为 delta
分配什么值?我应该分配 delta = 1
,以便 ln(delta + A)
将 return 0
只要 A
是 0
吗?
另外,请问使用自然对数或10进制或2进制对数有什么选择规则吗?
以下是我使用的公式:
Lw = exp[ 1 / N( sum[ log( delta + Lw( x, y ) ) ] ) ]
解释请参考这个link:Log average luminance
不知道A的范围是多少,很难回答。
如果A一般是一个整数,但恰好有时是0,那么returning log(A + 1)
会如你所愿,但是当A为0时return0。问题是如果您使用 log(A + 1)
而不是 log(A)
会对答案的使用产生什么影响,因为它们在数学上是不同的。
-- 编辑--
对于 [0,1] 范围内的实数 A,log(A) 的值无论如何都会是负数。在这种情况下,log(0) 的合理答案是 -Infinity。大多数编程语言使用 IEEE 754 standard 来表示浮点值,并且该标准包含一个 -Infinity 的值作为特殊值之一。在这里使用 -Infinity 将保持单调性,即如果 a < b,则 log(a) < log(b),即使 a == 0.
代码将取决于登录使用的实现;除非确定 log(0) 会 return -Infinity,否则显而易见的事情就是检查:
if(A == 0)
result = -INFINITY; // macro in math.h
else
result = log(A);
作为 (GNU) C 示例。
我正在使用公式来计算参数,该公式涉及对有时可能为零的值取对数。为了处理这种情况,我在文献中阅读了如下技术来放置一些增量值:
ln(delta + A)
这里的参数A
是一个实数,取值范围是[0, 1]
。
我应该为 delta
分配什么值?我应该分配 delta = 1
,以便 ln(delta + A)
将 return 0
只要 A
是 0
吗?
另外,请问使用自然对数或10进制或2进制对数有什么选择规则吗?
以下是我使用的公式:
Lw = exp[ 1 / N( sum[ log( delta + Lw( x, y ) ) ] ) ]
解释请参考这个link:Log average luminance
不知道A的范围是多少,很难回答。
如果A一般是一个整数,但恰好有时是0,那么returning log(A + 1)
会如你所愿,但是当A为0时return0。问题是如果您使用 log(A + 1)
而不是 log(A)
会对答案的使用产生什么影响,因为它们在数学上是不同的。
-- 编辑--
对于 [0,1] 范围内的实数 A,log(A) 的值无论如何都会是负数。在这种情况下,log(0) 的合理答案是 -Infinity。大多数编程语言使用 IEEE 754 standard 来表示浮点值,并且该标准包含一个 -Infinity 的值作为特殊值之一。在这里使用 -Infinity 将保持单调性,即如果 a < b,则 log(a) < log(b),即使 a == 0.
代码将取决于登录使用的实现;除非确定 log(0) 会 return -Infinity,否则显而易见的事情就是检查:
if(A == 0)
result = -INFINITY; // macro in math.h
else
result = log(A);
作为 (GNU) C 示例。