Javascript - 科学计数法的最大限制是什么?

3
在JavaScript中,我很好奇想知道在科学计数法中表示的最大可能数字而不会得到"Infinity"结果,因此我写了一个小程序并发现它是这个:
```javascript Number.MAX_VALUE.toExponential(); ```
该值为以下科学计数法:
``` 1.7976931348623157e+308 ```
17976931348623158079372897140530341507993413271003782693617377898044496829276475094664901797758720709633028641669288791094655554785194040263065748867150582068190890200070838367627385484581771153176447573027006985557136695962284291481986083493647529271907416844436551070434271155969950809304288017790417449779

这个数字可以被缩写为1.7976931348623157e+308。

我的问题是,是什么让这个特定的数字成为JavaScript中的最大可能值?它是否依赖于硬件(也许只有64位上的最大值?)或语言特定?为什么308是可用的最大10的幂次方?

另外,在其他语言中有什么不同?


2
请查看以下程序相关内容:https://tc39.github.io/ecma262/2017/#sec-terms-and-definitions-number-value 另外,您可以使用Number.MAX_VALUE来获取此值。 - Yury Tarabanko
你还考虑过哪些编程语言? - Icepickle
@Icepickle 只是想知道其他广泛使用的编程语言(我想到的是 C / C# / Java / Python 等等,而不是 Brainfuck 或类似的语言)是否有类似的科学计数法最大限制或不同的限制。 - Hankrecords
1
@Hankrecords 考虑中间值。它们在内存中是如何表示的?因此,您有308个数字作为字符串,但当您将其转换为数字引擎时,使用53位来存储308个“正确”的数字,对吗? - Yury Tarabanko
1
@Hankrecords,我是否误解了你的问题? - Hevar
显示剩余8条评论
1个回答

6

简短回答:
双精度浮点数。这是由于双精度数据类型的定义方式。

详细回答:

所有浮点数(双精度浮点数为双精度)都被写成两个值的乘积,即尾数和指数。原则上,这种方法类似于科学计数法中数字的写法:对于数字1.34 * 10^24,尾数为1.34,指数为24。

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

Number.MAX_VALUE

Number.MAX_VALUE的值是Number类型的最大正有限值,约为1.7976931348623157e+308。

此属性具有属性 {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}

http://ecma262-5.com/ELS5_HTML.htm#Section_8.5

对于浮点数(和双精度浮点数),不同之处在于将保存数字的总字节数分为两个部分,一个部分为尾数,一个部分为指数。 双精度二进制浮点格式:binary64

这给你一个10位的指数和一个指数的符号位,因此您将得到-1023到+1024的数字。

然而,指数的基数不是10,而是2。浮点数指数的存储方式使用了8位(对于浮点数)或11位(对于双精度浮点数),这意味着您可以获得-127到+128(浮点数)或-1023到+1024(双精度浮点数)的指数值。

2^1024给我们一个值为1.797693134862315907729305190789 * 10^308,这是双精度浮点数指数的最大值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接