Dag*_*bit 6 javascript floating-point
这个javascript表达式可以评估的最高数字是多少?最低的数字是多少?为什么?
+(''+Math.random()).substring(2)
Run Code Online (Sandbox Code Playgroud)
额外信用:表达式可以评估多少个不同的值?可以是从最小值到最大值的每个值,还是由于舍入问题而无法获得的某些中间值?
回应丹尼尔的回答(删除,为10000000000000000最大,0分):
我在Chrome的控制台里玩,得到了这个:
Math.random();
>> 0.00012365682050585747
'12365682050585747'.length
>> 17
12365682050585747 > 10000000000000000
>> true
Run Code Online (Sandbox Code Playgroud)
......所以10000000000000000不能是最大的!
这取决于随机数如何生成以及如何将数字转换为字符串。ECMAScript 规范没有指定这两者。
\n\n实际上,该数字最多有 17 位有效数字,因此最大值应最多为 10 17。
\n\n规范确实指定当指数在 -6 到 20 (10 -6 \xe2\x89\xa4 x < 10 21 ) 之间时,数字将以十进制形式(而不是科学形式)显示,因此我们只需要限制当我们试图穷举寻求最大值时,我们的注意力集中在 [10 -6 , 1)中的数字上。
\n\n然而,在此范围内,数字必须表示为s × 2 e,其中 1 \xe2\x89\xa4 s \xe2\x89\xa4 2 − 2 -52,精度为 Δ s = 2 -52和 -20 \ xe2\x89\xa4和\xe2\x89\xa4 -1。规范建议,因此对于给定的eToNumber(ToString(x)) == x,数字应该精确到 2 -52+ e。因此,具有最小n的 (2 − n × 2 -52 ) × 2 e的“17 位”数字将是在截断初始 后用给定e表示的最大数字。0.
v \n(-20) 0.0000019073486328124998\n(-19) 0.0000038146972656249996\n(-18) 0.0000076293945312499975 (n=3)\n(-17) 0.000015258789062499998\n(-16) 0.000030517578124999997\n(-15) 0.000061035156249999986 (n=2)\n(-14) 0.00012207031249999999\n(-13) 0.00024414062499999997\n(-12) 0.00048828124999999995\n(-11) 0.0009765624999999999 (always 16-digit?)\n(-10) 0.0019531249999999998\n(-9) 0.0039062499999999996\n(-8) 0.0078124999999999965 (n=4)\n(-7) 0.015624999999999998\n(-6) 0.031249999999999997\n(-5) 0.062499999999999986 (n=2)\n(-4) 0.12499999999999999\n(-3) 0.24999999999999997\n(-2) 0.49999999999999994\n(-1) 0.9999999999999999 (always 16-digit?)\nRun Code Online (Sandbox Code Playgroud)\n\n从这里我们知道绝对最大值是78,124,999,999,999,965。
\n\nMath.random()可以返回区间 [0, 1) 中的任何非负数,因此安全最小值为 -324 5e-324(双精度中最小的次正规数为 4.94 × 10 -324)。
| 归档时间: |
|
| 查看次数: |
6068 次 |
| 最近记录: |