1. 基本概念
Math.log1p()方法的作用和Math.log()方法非常相近,它们都是用于计算一个数的自然对数。自然对数就是以自然常数e为底数的对数,在数学上也等价地表示为ln(x)。
调用Math.log1p()方法的语法形式如下所示:
Math.log1p(x);
上面我们说到了Math.log1p()和Math.log()的相同之处,那么它们又有什么不同呢?区别就在于它们各自是对哪一个数求自然对数,这个数和它们的参数有什么关系。
我们将Math.log1p()的方法名分成三部分,分别为:log、1和p。其中log就是“求对数”的意思,1就是数字1;而p表示“plus”,即加法。因此Math.log1p()中的1p就表示“1加上”的意思,那么到底加上什么呢?当然就是后面括号中的参数了。所以Math.log1p()就是先计算1加上它的参数的和,再计算该和的自然对数。
Math.log()方法名中没有1p,也就是不需要加1而直接对它的参数求自然对数,因此Math.log(x)等于ln(x)而Math.log1p(x)等于ln(1 x)。
对参数x的要求就是它应该是一个数字,即x属于Number类型;如果不是,那么它会先被自动转换为Number类型。
图1 ln(1 x)的函数图像
图1展示了ln(1 x)的函数图像,结合该图像以及当参数x为特殊值时,我们来详细说明JavaScript是如何判定Math.log1p()方法的结果的。
1. 如果x是NaN,那么结果是NaN;
2. 如果x小于-1,那么结果是NaN;因为此时x在函数的定义域之外;
3. 如果x是-1,那么结果是负无穷(-Infinity);严格来说此时x也在函数定义域之外,但JavaScript这样处理也说得过去,因为当x趋近于-1时ln(1 x)趋近于负无穷;
4. 如果x是 0,那么结果是 0;
5. 如果x是-0,那么结果是-0;
6. 如果x是正无穷( Infinity),那么结果是正无穷;
7. 其余情况下,x是普通数字并且在函数的定义域内,因此结果就是ln(1 x)的值。
如果你传递的x不是数字,那么上面这些规则中提到的x的值指的是它被转换为数字后的值。这些规则看似很多、很杂乱,但它们在本质上都是计算函数ln(1 x)的值,结合函数图像以及JavaScript有五个特殊数字(NaN、 0、-0、正无穷和负无穷)可以很容易地理解它们。
2. 示例
<script>
/* 下面3个方法调用中,参数都是普通数字 */
var value1 = Math.log1p(-6);
console.log("Math.log1p(-6):");
console.log(value1);
var value2 = Math.log1p(-1);
console.log("\nMath.log1p(-1):");
console.log(value2);
var value3 = Math.log1p(20);
console.log("\nMath.log1p(20):");
console.log(value3);
/* 下面4个方法调用中的参数都是特殊数字 */
var value4 = Math.log1p(NaN);
console.log("\nMath.log1p(NaN):");
console.log(value4);
var value5 = Math.log1p( 0);
console.log("\nMath.log1p( 0):");
console.log(value5);
var value6 = Math.log1p(-0);
console.log("\nMath.log1p(-0):");
console.log(value6);
var value7 = Math.log1p( Infinity);
console.log("\nMath.log1p( Infinity):");
console.log(value7);
/*
* false转换成数字为 0,因此
* Math.log1p(false)等价于Math.log1p(0)
*/
var value8 = Math.log1p(false);
console.log("\nMath.log1p(false):");
console.log(value8);
</script>
以上代码的执行结果如图2所示:
图2 Math.log1p()方法的执行结果
(完)
,