为何 Math.min() 比 Math.max() 大?(续)

昨天心血来潮写了一篇文章:为何Math.min() 比 Math.max() 大?

为何很多人会有这类迷惑,是由于犯了想当然的毛病——望文生义。Math.min() 作为一个函数,返回的并非最小值;同理 Math.max() 返回的也不是最大值。他们返回的是参数的最大值和最小值,而我们却没有通报任何参数。

javascript 中数值的最大值和最小值常量分别是 Number.MAX_VALUENumber.MIN_VALUE,在我电脑 V8 的运转效果是 1.7976931348623157e+3085e-324

这里也有一个坑,那就是 MIN_VALUE 并非最小的数,而是绝对值最小的数,它是一个正数。而 Math.min() 的返回值比 Number.MAX_VALUE 还要大。

Math.min() 返回了 Infinity,这个值对应了 Number.POSITIVE_INFINITY 常量。Math.max() 返回了 -Infinity,这个值对应了 Number.NEGATIVE_INFINITY 常量。

就像数学内里那样,正无限和负无限并非确切的数,只是鸠合内里的观点。我们能够运用 0 减去正无限来获得负无限:0 – Infinity = -Infinity,或许经由过程 0 减去负无限来获得正无限:0 – (-Infinity) = Infinity。然则我们把正无限和负无限相加却得不到 0,事实上我们获得的是 NaN。

当我们真正邃晓了 Math.min 和 Math.max 只是返回了一切参数的最大值,就很轻易明白这个看似匪夷所思的效果了。

原本想检察 V8 的源码,然则搜刮了一圈,也只找到了几个测试用例(文件: test/mjsunit/math-min-max.js):

assertEquals(Infinity, Math.min()); 
assertEquals(1, Math.min(1)); 
assertEquals(1, Math.min(1, 2)); 
assertEquals(1, Math.min(2, 1)); 
assertEquals(1, Math.min(1, 2, 3)); 
assertEquals(1, Math.min(3, 2, 1)); 
assertEquals(1, Math.min(2, 3, 1)); 

今后测试用例中能够看出,Math.min() 确切返回了 Infinity。继承浏览此测试用例还会发明更有意义的事:

assertEquals(-Infinity, Infinity / Math.min(-0, +0)); 
assertEquals(-Infinity, Infinity / Math.min(+0, -0)); 
assertEquals(-Infinity, Infinity / Math.min(+0, -0, 1)); 

对照下面的效果:

assertEquals(Infinity, Infinity / Math.max(-0, +0)); 
assertEquals(Infinity, Infinity / Math.max(+0, -0)); 
assertEquals(Infinity, Infinity / Math.max(+0, -0, -1));

也就是说在 Math.minMath.max 举行数值比较(javascript不分整型和浮点型)时,负零是小于正零的。

-0、+0、-Infinity、+Infinity、NaN 这几个观点就能够讲上一天一夜了,篇幅有限就不睁开讲了,今后有时间再填坑。

言归正传,如今我们换个思绪,试着从算法的角度去斟酌最大值和最小值的题目。

我们怎样求 N 个参数的最大值呢?为了形貌简朴我们运用数组(谢谢 @f2er前端百科)

var max = ___;
arr.forEach(function(n) { 
    if(n > max) { 
        max = n; 
    }
});

假如是填空题,你会在空格处填什么呢?云云想来,这个返回值就很合理了。

原本以为是无参调用时返回了运算的幺元,厥后细揣摩,彷佛没有什么关系,2333

关于运算鸠合 S 上的二元运算,假如满足 ax = xa = x,则 a 是运算的幺元。加法运算的幺元是 0,由于 0+x = x+0 = x。乘法运算的幺元是 1,由于 1x = x1 = x。然则我们定义函数 add() 或许 mult() 函数,假如不通报参数时,返回幺元的话也是不合理的。

完。

    原文作者:justjavac
    原文地址: https://segmentfault.com/a/1190000006933393
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞