【问题标题】:Working with numbers larger than max decimal value使用大于最大十进制值的数字
【发布时间】:2010-11-24 04:42:28
【问题描述】:

我正在处理前 26 个素数的乘积。这需要超过 52 位的精度,我相信这是 double 可以处理的最大值,并且超过了小数可以提供的 28-29 位有效数字。那么对这么大的数字执行乘法和除法的一些策略是什么?

另外,为了实现这一点,我必须跳过任何障碍对性能有何影响?

前 22 个素数的乘积(我可以在计算器上相乘而不会进入科学模式的最多)是:

10,642,978,845,819,148,849,204,664,294,430

最后四个的乘积是

72,370,439

当相乘时,我得到:

7.7023705133964511682328635583552e+38

性能影响在这里尤为重要,因为我们本质上是在尝试解决质数字符串比较解决方案在实践中是否比直接比较字符更快的问题。促使这项调查的帖子是here。处理器针对浮点计算进行了优化;理想情况下,我希望在最终得到的任何解决方案中尽可能多地利用这种优化。

TIA!
詹姆斯

PS:我拥有的代码是用于竞争解决方案的;我不认为素数解决方案可能更快,但我正在努力给它尽可能公平的机会。

【问题讨论】:

    标签: c# precision


    【解决方案1】:

    您可以在 C#4.0 中使用BigInteger。对于旧版本,我认为您需要一个开源库,例如this one

    【讨论】:

    • 我可以在 4.0 中做到这一点,我还没有玩太多,但那将是完美的。您链接到的图书馆令人印象深刻......我很惊讶它自 2002 年以来一直没有更新,尽管可能没有必要。我去看看源码。非常好!
    • @James:给出的链接只是一个例子,告诉你开源站点中有很多优秀的开源库。下次你需要图书馆的时候,试着在那里找一个。
    【解决方案2】:

    我阅读了您链接到的关于面试问题的帖子。由于您只是将这些大整数相乘和相除,因此巨大 优化是将它们保持在素数分解形式。每个大整数是一个整数数组 [0..25],每个元素代表分解中第 n 个素数的指数。要以这种形式将两个大整数相乘,只需将指数逐个元素相加即可;除,减指数。

    但是您会看到这相当于将两个字符串的字符数制成表格。

    【讨论】:

    • 嗯,我不太了解,您能进一步解释一下,或者举一些例子吗?
    猜你喜欢
    • 2021-09-09
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多