【问题标题】:Size of integers in ClojureScriptClojureScript 中整数的大小
【发布时间】:2015-12-30 19:09:50
【问题描述】:

这个page 说如下:

ClojureScript 目前只支持整数和浮点数 映射到 JavaScript 原语的文字

有人能告诉我这对整数意味着什么吗?它们是 64 位的吗(可能不是,因为它需要 两个 JS 数字)?还是32位?还是 53 位(这是双 AFAIK 中的最大整数位,请参阅 here)?

[编辑] 原因 我想知道这一点,是我想使用“跨平台”语言编写一个“模拟”,这样模拟在客户端(浏览器(JS),Android,Web-Start,...)和服务器(JVM)。众所周知,浮点会导致模拟的“去同步”,因为不同的硬件可以在相同的输入下为相同的计算给出不同的结果。因此我只想使用“整数”,但如果整数的大小在 Clojure 和 ClojureScript 之间不同,我最终还是会得到“去同步”(例如,当达到 integer overflow 时,它用于随机数字生成器,在模拟中大量使用)。

【问题讨论】:

标签: clojure clojurescript


【解决方案1】:

“映射到 JavaScript 原语。”在我看来,这意味着 ClojureScript 整数与 JavaScript 整数完全相同:它映射到相同的原始类型。根据this answer,是2^53-1

【讨论】:

  • 根据这个页面,w3schools.com/js/js_datatypes.asp,“JavaScript 只有一种数字。”,即 64 位浮点数,也就是双精度数。所以 JS 实际上并没有将“整数”作为一种“原始”类型,这就是为什么我应该从关于 ClojureScript 的声明中假设“32 位”对我来说并不明显。
  • 点。我处理大值的频率不足以使 32 位成为问题(我认为它在十年内出现一次)。鉴于 JS 只有一种类型,64 位,那么我假设 ClojureScript 也只有一种有效类型,具有相同的属性和限制,即 2^53,stackoverflow.com/questions/307179/…
  • (为什么 LaTeX 格式现在不适合我?)更新的答案。
【解决方案2】:

我试图以某种方式验证@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)。

【讨论】:

  • 因为编程很神奇,所以总是值得做一个实验来确定你是否真的是对的。荣誉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2011-11-10
  • 1970-01-01
相关资源
最近更新 更多