为什么 Math.min() 比 Math.max() 大?
考虑如下代码:
- var min = Math.min();
- var max = Math.max();
- console.log(min < max);
按照常规思路,这段代码应该输出 true,毕竟最小值应该小于最大值。但是当我们运行这段代码时,却神奇的输出了 false。
为什么会这样呢?
还得去查查 MDN 的相关文档。
The Math.min() function returns the smallest of zero or more numbers.
Math.min 的参数是 0 个或者多个。如果是多个参数很容易理解,返回参数中最小的。
如果是 0 个参数呢?文档中写到:
If no arguments are given, the result is Infinity.
If at least one of arguments cannot be converted to a number, theresult is NaN.
如果没有参数,则返回 Infinity。Infinity 是什么呢?Infinity 是 javascript 中全局对象的一个属性,在浏览器环境中就是window 对象的一个属性,表示无穷大。
而 Math.max() 没有传递参数时返回的是 -Infinity。因此 Math.min() 要比 Math.max() 大。
后续:
为什么很多人会有这种疑惑,是因为犯了想当然的错误——望文生义。Math.min() 作为一个函数,返回的并不是最小值;同理 Math.max() 返回的也不是最大值。他们返回的是参数的最大值和最小值,而我们却没有传递任何参数。
javascript 中数值的最大值和最小值常量分别是 Number.MAX_VALUE 和 Number.MIN_VALUE,在我电脑 V8 的运行结果是 1.7976931348623157e+308 和 5e-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.min 和 Math.max 进行数值比较(javascript不分整型和浮点型)时,负零是小于正零的。
-0、+0、-Infinity、+Infinity、NaN 这几个概念就可以讲上一天一夜了,篇幅有限就不展开讲了,以后有时间再填坑。
言归正传,现在我们换个思路,试着从算法的角度去考虑最大值和最小值的问题。
我们如何求 N 个参数的最大值呢?为了描述简单我们使用数组(感谢 @f2er前端百科)
- var max = ___;
- arr.forEach(function(n) {
- if(n > max) {
- max = n;
- }
- });
如果是填空题,你会在空格处填什么呢?如此想来,这个返回值就很合理了。
--------------------------------
<del>本来以为是无参调用时返回了运算的幺元,后来细琢磨,好像没有什么关系,2333
对于运算集合 S 上的二元运算*,如果满足 a*x = x*a = x,则 a 是*运算的幺元。加法运算的幺元是 0,因为 0+x = x+0 = x。乘法运算的幺元是 1,因为 1*x = x*1 = x。但是我们定义函数 add() 或者 mult() 函数,如果不传递参数时,返回幺元的话也是不合理的。</del>
作者:justjavac
来源:51CTO
为什么 Math.min() 比 Math.max() 大?相关推荐
- Math.min()和Math.max()的使用
Math.min()返回零个或更多个数值的最小值 1.返回给定数值中最小的数.如果任一参数不能转换为数值,则返回NaN.如果没有参数,结果为Infinity(无穷大). 参数有效值:整数,浮点数,数字 ...
- 深入学习java源码之Math.max()与 Math.min()
深入学习java源码之Math.max()与 Math.min() java基本数据类型及自动转型 8种基本数据类型及其所占空间大小: 一.byte,占用一个字节,取值范围为 -128-127,默认是 ...
- 使用Math.max和Math.min求数组的最大值和最小值
正常情况下,如果我们求数组的值,用到的就是for循环,如果在代码中经常求最大值和最小值的话,会显得代码很乱.所以,就考虑一中最简单的方法求最大值. 使用Math里面自带的max和min方法 funct ...
- 使用Math.max和Math.min方法实现三个数中取中位数
public int midNum(int a,int b,int c){int mid = Math.max(a,b) > c ? Math.max(Math.min(a,b),c) : Ma ...
- System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1) 在vb里面 等价于i=i-1 在C#里面 等价于i-- 是有C#自 ...
- math.pow int_Java Math类static int min(int i1,int i2)与示例
math.pow int 数学类静态int min(int i1,int i2) (Math Class static int min(int i1 , int i2) ) This method i ...
- math 计算float_Java Math类静态float min(float f1,float f2)与示例
math 计算float 数学类静态浮点数min(float f1,float f2) (Math Class static float min(float f1 , float f2) ) This ...
- java math max_Java Math类静态double max(double d1,double d2)示例
java math max 数学类静态double max(double d1,double d2) (Math Class static double max(double d1,double d2 ...
- 数据结构:删除顺序表中小于min和大于max的数(不需要从大到小排列依然可以)
1.题目要求: 设计一个算法,删除递增有序链表中值小于min和大于max的所有元素 2.题目分析 依次找到对应元素,而后进行删除. int listDelete(SqList& L, int ...
- math.hypot java_Java math
Java math 函数 JavaMath类提供了几种用于数学计算的方法,例如min(),max(),avg(),sin(),cos(),tan(),round(),ceil(),floor(),ab ...
最新文章
- 算法试题 - 找出最小 k 个数
- 深度学习的数学 (6)误差反向传播法必需的链式法则
- 记录一个海思TOE的BUG
- linux进程源码分析,Linux内核源代码分析——口述程序猿如何意淫进程(一)
- 第三次学JAVA再学不好就吃翔(part24)--构造方法
- C++:08---成员变量初始化方式
- 怎么将tflite部署在安卓上_tensorflow从训练自定义CNN网络模型到Android端部署tflite...
- pppoe路由桥混合模式启用_无线路由器怎么设置
- c++语言编程,一个电灯两个开关控制,[理学]四川大学计算机学院精品课程_面向对象程序设计C++课件_游洪越_第一章绪论.ppt...
- asp.net mvc 发布问题
- atitit 编程语言选型知识点体系.docx 编程语言选型时,你需要考虑的几个方面 目录 1. 1.2. 类型系统	5	1 2. 1.5. 语言规范	25	1 3. 1.6. 编程范式	52
- 芯片架构--四大处理器架构
- springboot教务评教系统毕业设计源码252116
- SEO中的关键词密度该如何布局
- oa工作任务管理系统设计
- django踩坑记录
- 云数智驱动数据高速增长,浪潮存储提供EB级容量扩展
- 下载分享永不关机 几步玩转家庭NAS组建
- 一个小问题,解决提示无法启动程序,“....exe”。系统找不到指定文件
- ElementUI表格吸顶(sticky)
热门文章
- Atitit 使用js nodejs进行图像处理ocr的解决方案attilax总结
- paip. mysql如何临时 暂时 禁用 关闭 触发器
- paip.asp vbs通过CLI命令行调用PHP代码
- python : 读取csv最快的Datatable的用法
- Julia: 趣!,13579分别在一本168页书的页码中出现的次数
- Julia:副本copy引发的问题,期待0.4.0版本!
- 十种程序语言帮你读懂大数据的“秘密”,Julia位列其中!(转)
- 掌门教育微服务体系 Solar
- OpenInfra中国日志愿者第三次会议召开
- 【图像去噪】基于matlab GUI DCT图像去噪【含Matlab源码 614期】