【问题标题】:What programming language will enable me to enter a very long number without converting it to floating point?什么编程语言可以让我输入一个很长的数字而不将其转换为浮点数?
【发布时间】:2010-12-11 19:22:56
【问题描述】:

执行以下操作的最佳方法是什么。

输入一个很长的数字,假设它是 500,000 位长而不用科学记数法;然后可以用它做数学运算,比如 +2 等?

提前谢谢你。

编辑:它是一个 500,000 位的正整数。

【问题讨论】:

  • 你有什么反对科学记数法的?
  • 几乎任何语言都可以。不过,您可能需要编写一些代码 :-)
  • Python 完全没有任何特殊的库就可以做到这一点。此外,Unix 的 bc 程序是一门完整的编程语言,无需任何特殊库也可以做到。
  • @unknown:任何图灵完备的编程语言都可以接受文本输入并访问足够的内存。
  • @snicker:可以,它只需要很多个数字。双精度浮点数(这只是基于科学记数法的一种实现)在很长一段时间内都没有足够的位数,但一般来说科学记数法没有固有的限制。

标签: math programming-languages digits


【解决方案1】:

PythonJava 具有原生支持,C++C.NET、...的库存在

【讨论】:

  • 我不会将 Java 的 BigInteger 类描述为“原生支持”。
  • 我不知道,BigInteger 不像 Python 提供的那样“原生”或好用,但至少它是语言自带的。
【解决方案2】:

我知道 Erlang 支持无限大小的 int 算术。

【讨论】:

  • +1 Erlang 在这方面非常受欢迎。而且它是免费的……不像 Mathematica。
  • Erlang 没有任意精度的浮点数。
  • 进一步澄清:浏览了 Erlang 的源代码,整数运算是用 C 编写的,所以它非常原生 IMO。
【解决方案3】:

Python 开箱即用,无需特殊库。 Unix 系统的“bc”(一种伪装成计算器的完整编程语言)也是如此。

【讨论】:

    【解决方案4】:

    Python 本身非常好,但使用gmpy 更好(它将它连接到其他人提到的 GMP 库,或者连接到 MPIR 有点像工作的库 [[work in progress;-)]] )。考虑:

    $ python -mtimeit -s'x=int("1"*9999); y=int("2"*9999)' 'x*y'
    100 loops, best of 3: 6.46 msec per loop
    

    即,在纯 Python 中,将两个 10K 位整数相乘需要 6.5 毫秒左右。还有……:

    $ python -mtimeit -s'from gmpy import mpz; x=mpz("1"*9999); y=mpz("2"*9999)' 'x*y'
    1000 loops, best of 3: 326 usec per loop
    

    ...有了gmpy,操作会快20倍左右。如果你有数百而不是数千位数,那就更极端了:

    $ python -mtimeit -s'x=int("1"*199999); y=int("2"*199999)' 'x*y'
    10 loops, best of 3: 675 msec per loop
    

    $ python -mtimeit -s'from gmpy import mpz; x=mpz("1"*199999); y=mpz("2"*199999)' 'x*y'
    100 loops, best of 3: 17.8 msec per loop
    

    所以,用 200k 位而不是只有 10k,gmpy 的速度优势是 38 倍左右。

    如果您经常需要处理这种数量级的整数,Python + gmpy 确实是一个可行的解决方案(当然我有偏见,因为我在过去几年中创作和关心 gmpy 正是因为我♥ Python(嘿,我的牌照是 P♥thon!-) 并且在我的一个爱好(组合算术)中,我确实必须处理这样的数字经常;-)。

    【讨论】:

      【解决方案5】:

      Mathematica 允许您进行此类数学运算,并且您可以在其中编写完整的程序。

      否则,您寻求的是一个“库”来扩展另一种编程语言(例如 Python 或 Java)的内置功能。

      对于 Python,decimal module 使您能够指定执行数学运算的精度。

      【讨论】:

      • 我马上试试 Mathematica。
      • 您是在使用整数,还是使用也有小数部分的数字?在任何一种情况下,Mathematica 都会起作用,我只是想知道还有哪些其他解决方案适用于您。
      • 如果你指定了一个精度,你不能做诸如将 2 加到一个有 500,000 个零的数字上......除非你使用一个 bignum 模块或...... Erlang......这是免费的。最后我检查了一下,Mathematica 很贵……而且比只需要(几乎)无限精度更强大。
      • 我以为有试用版……但你必须申请。我将试探性地尝试 Erlang 或 Python。
      【解决方案6】:

      Common Lisp 也内置了对任意大数的支持...

      【讨论】:

        【解决方案7】:

        Haskell(使用 GHC 时)还内置了对任意长整数的支持。这是一个 sn-p 显示转换为字符串的数字的长度。

        Prelude> length $ show $ 10
        2
        Prelude> length $ show $ 1 + 2^2000000
        602060
        Prelude> let x = 2^200000
        Prelude> let y = 2^200000 + 5
        Prelude> y - x
        5
        

        或者您可以在交互式控制台上键入2^200000 并等待几分钟,让它打印出所有 600k+ 个字符。我认为这种方式演示起来更简单一些。

        【讨论】:

        • 取决于 Haskell 的版本。例如,氦气不支持任意精度的算术。
        【解决方案8】:

        Perl、Python、Ruby 和 Java 都可以做到这一点。其他一切都存在外部库。

        我更喜欢 Ruby 和 Python,因为它们会自动从 Fixnum 切换到 Bignum。 (Python:intlong。)

        【讨论】:

        • Erlang 也这样做了,你的列表中没有其他几种编程语言也是如此。
        【解决方案9】:

        Perl 有一个 bignum 模块来做这种事情,Python 本身就支持它。

        【讨论】:

        • Python 没有 bignum 模块:它的整数本身就是无限精度的。
        【解决方案10】:

        您要查找的不一定是语言,而是任意精度的库。

        GMP 将是 C/C++ 中的快速实现,处理大整数的脚本语言可能会使用类似的东西。

        【讨论】:

          【解决方案11】:

          在 C 或 C++ 中,您可以使用GMP (Gnu Multi-Precision library)

          在 Perl 中,您可以使用 bignum module

          【讨论】:

            【解决方案12】:

            MIT/GNU Scheme 支持任意大的数字。

            【讨论】:

              【解决方案13】:

              许多函数式语言本身就支持任意精度的数字。这里已经提到了一些,但为了完整起见,我将重复它们:

              【讨论】:

                【解决方案14】:

                我发现 Python 在这方面做得很好。

                【讨论】:

                  猜你喜欢
                  • 2019-10-17
                  • 2016-05-13
                  • 1970-01-01
                  • 2021-10-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-11-26
                  • 2014-10-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多