微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 gmp 风格 API 的 JavaScript BigInt,特别是 mpfr

如何解决带有 gmp 风格 API 的 JavaScript BigInt,特别是 mpfr

我正在编写一个从我的桌面编程语言到 JavaScript 的转译器。

我在桌面上使用 gmp,所以我正在编写一个薄的包装器来模仿相同的入口点,但在引擎盖下使用 BigInt。 (NB Emscripten 等不涉及)到目前为止 mpz 和 mpq 工作得很好,每个都有大约 30 个入口点,手工完成,所以现在我想知道 mpfr。

mpfr 可以作为 mpq 完成,隐含/上限分母为 10^k(其中 k 可以为负),并且 相应地被截断/BigInt 分子?我预计 mpfr_const_pi()、mpfr_sin/log/exp() 等会有点困难。我说 10^k,但我什至不确定是 2^k。

我研究了 https://github.com/MikeMcl/big.js 和朋友,但没有冒犯的意思,所有这些似乎都早于 BigInt,我根本找不到任何通过 BigInt 实现浮点数的东西。

简而言之,mpfr.js 中需要包含哪些代码才能使以下内容正常工作(理想情况下未更改),显然任何部分想法、提示或技巧都与完整的工作示例一样受欢迎。您可以假设(例如) mpz_get_str() 可用,或者当然您可以直接使用(例如) BigInt.toString() 等,而不必对小数点的精确位置或任何“%. 75Rf”相关的细微差别。我只需要一些东西让球滚动。

  <script src="mpfr.js"></script>
  <script>
  mpfr_set_default_prec(252); // (enough for 75 decimal places)
  let one_third = mpfr_init(1); // (ok,non-std Syntax,anyway init to 1)
  mpfr_div_si(one_third,one_third,3);
  console.log(mpfr_sprintf("%.75Rf",one_third);
  </script>

解决方法

我终于找到了这个 https://jrsinclair.com/articles/2020/sick-of-the-jokes-write-your-own-arbitrary-precision-javascript-math-library/,现在我已经拥有了几乎所有我需要工作的东西。

虽然这正是我正在寻找的,但我应该指出它存在严重缺陷,例如有一个坦率地令人发指的 memoize() 函数被广泛应用,这无疑大大改善了一些毫无意义的基准,但会完全削弱真实-world 使用,以及其他严重低效的情况,例如 exp10(n) 返回 BigInt(1${[...new Array(n)].map(() => 0).join("")}),而不是更理智的 10n**B​​igInt(n)。尽管如此,它还是相当有活力,不可否认,它的用意是好的,有很多好主意。

如果有人希望看到我的努力成果,我已经上传了最新版本:https://github.com/petelomax/Phix/blob/master/pwa/builtins/mpfr.js

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。