【问题标题】:Smallest Integer Greater than Very Large Number大于非常大数的最小整数
【发布时间】:2011-12-17 00:06:08
【问题描述】:

我试图找到大于一个非常大的数字的最小整数(例如,exp(5000000))。我该怎么做呢?如果不是以编程方式(因为这在 MATLAB 或我的计算器中计算为无穷大或溢出),那么在数学上呢? (已经尝试过 exp(floor(log(exp(5000*1024)))) 但这只会给出无穷大)。

【问题讨论】:

  • 用数学方法找到它到底是什么意思?例如,您是否正在寻找一个给出第 n 位数字的函数?
  • 只是为了让您了解这个数字有多大,我在 MATLAB 中使用 Symbolic Toolbox 尝试了以下操作:ceil( sym('exp(5000000)') ) 结果是巨大的:pastebin.com/BXDbPydL
  • 是的。它有大约 217 万位数字。巨大的。
  • 我不明白为什么数字的大小应该是一个问题。即使使用一个完整的字节来写入一个数字,包含这个数字的文件仍然不会大于 3Mb。

标签: math matlab numbers integer


【解决方案1】:

您需要使用处理大数字的库。

我的 google karma 似乎指向Symbolic Math Toolbox

【讨论】:

  • 但是 N 是整数,而不是数字。 exp(5000000) 不一定是整数。
  • @JustinM 你是对的。我已经删除了不正确的陈述。
【解决方案2】:

如果你想计算一个大数的所有数字,最简单的解决方案可能是使用 Maple 或 Mathematica。如果您只是想要简单免费的东西,可以使用Wolfram Alpha

例如:

【讨论】:

    【解决方案3】:

    您想要提供精度可变算术的东西,例如Symbolic Math Toolboxceiling function

    【讨论】:

      【解决方案4】:

      就像 Klas sais。如果你整数 i N,那么最小的较大整数是 N+1。要使用例如 C 进行计算,您可以编写一个函数,例如

      unsigned long smallestLargerInteger(unsigned long startNum) {
        return startNum +1;
      }
      

      为了确保你不会溢出 long 你可以有类似的东西

      #define __HALF_MAX_SIGNED(type) ((type)1 << (sizeof(type)*8-2))
      #define __MAX_SIGNED(type) (__HALF_MAX_SIGNED(type) - 1 + __HALF_MAX_SIGNED(type))
      #define __MIN_SIGNED(type) (-1 - __MAX_SIGNED(type))
      
      #define __MIN(type) ((type)-1 < 1?__MIN_SIGNED(type):(type)0)
      #define __MAX(type) ((type)~__MIN(type))
      
      unsigned long smallestLargerInteger(unsigned long startNum) {
        if(__MAX(long) == startNum) {
          // handle overflow error messaging here
        }
      
        return startNum +1;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-01-22
        • 2017-01-10
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        相关资源
        最近更新 更多