ClojureScript 中整数的大小
Size of integers in ClojureScript
这个 page 说了以下内容:
ClojureScript currently only supports integer and floating point
literals that map to JavaScript primitives
有人能告诉我整数的实际含义吗?它们是 64 位的吗(可能不是,因为它需要 two JS 数字)?还是 32 位?或 53 位(即双精度 AFAIK 中的最大整数位,请参阅 here)?
[编辑] 我想知道的 原因 是我想使用 "cross-platform" 语言编写 "simulation",这样模拟在客户端(浏览器(JS),Android,Web-Start,...)和服务器(JVM)中给出相同的结果。众所周知,浮点数会导致 "de-synchronisation" 进行模拟,因为不同的硬件可以使用相同的输入为相同的计算给出不同的结果。因此我只想使用 "integers",但是如果 Clojure 和 ClojureScript 之间的整数大小不同,我最终还是会得到 "de-synchronisation"(例如,当达到 integer overflow 时,用于模拟中大量使用的随机数生成器。
"Maps to JavaScript primitives." 在我看来,这意味着 ClojureScript 整数与 JavaScript 整数完全相同:它映射到相同的原始类型。根据 this answer,它是 2^53-1
我试图以某种方式验证@Draco18s 的答案,并最终在 ClojureScript REPL 中找到了这段代码:
cljs.user=> (- (+ 9007199254740990 1) 1)
9007199254740990
cljs.user=> (- (+ 9007199254740991 1) 1)
9007199254740991
cljs.user=> (- (+ 9007199254740992 1) 1)
9007199254740991
看起来“9007199254740992”仍然是一个有效的整数,但我认为这只是因为四舍五入之类的原因。所以,它真的是 9007199254740991(或 2^53-1)。
这个 page 说了以下内容:
ClojureScript currently only supports integer and floating point literals that map to JavaScript primitives
有人能告诉我整数的实际含义吗?它们是 64 位的吗(可能不是,因为它需要 two JS 数字)?还是 32 位?或 53 位(即双精度 AFAIK 中的最大整数位,请参阅 here)?
[编辑] 我想知道的 原因 是我想使用 "cross-platform" 语言编写 "simulation",这样模拟在客户端(浏览器(JS),Android,Web-Start,...)和服务器(JVM)中给出相同的结果。众所周知,浮点数会导致 "de-synchronisation" 进行模拟,因为不同的硬件可以使用相同的输入为相同的计算给出不同的结果。因此我只想使用 "integers",但是如果 Clojure 和 ClojureScript 之间的整数大小不同,我最终还是会得到 "de-synchronisation"(例如,当达到 integer overflow 时,用于模拟中大量使用的随机数生成器。
"Maps to JavaScript primitives." 在我看来,这意味着 ClojureScript 整数与 JavaScript 整数完全相同:它映射到相同的原始类型。根据 this answer,它是 2^53-1
我试图以某种方式验证@Draco18s 的答案,并最终在 ClojureScript REPL 中找到了这段代码:
cljs.user=> (- (+ 9007199254740990 1) 1)
9007199254740990
cljs.user=> (- (+ 9007199254740991 1) 1)
9007199254740991
cljs.user=> (- (+ 9007199254740992 1) 1)
9007199254740991
看起来“9007199254740992”仍然是一个有效的整数,但我认为这只是因为四舍五入之类的原因。所以,它真的是 9007199254740991(或 2^53-1)。