【问题标题】:How to avoid overflow with large logarithms如何避免大对数溢出
【发布时间】:2014-08-13 18:08:07
【问题描述】:

我正在尝试在 Java 中计算一个大对数,但无法弄清楚如何解决溢出问题。研究表明我需要使用 BigDecimal 类,但我不能对此进行双重转换。 任何人都可以帮忙吗?

干杯,这是我正在尝试计算的示例: Math.log10(13168375/4224127912)

【问题讨论】:

  • 我不确定这里有什么问题。为什么你不能只做log10(13168375) - log10(4224127912)?溢出在哪里?
  • 为什么不能直接从double 创建一个新的BigDecimal 而不是强制转换? BigDecimal someNumber = new BigDecimal(doublVal);
  • 如果要计算 BigDecimal 的 log,请参阅 this answer

标签: java overflow logarithm


【解决方案1】:

您必须解释错误消息。

Y.java:16: error: integer number too large: 4224127912
        System.out.println(          Math.log10(13168375/4224127912) );
                                                     ^

这意味着 4224127912 (!) 对于整数来说太大了。

你可以:

 Math.log10(13168375/4224127912.0)   // use a double literal

 Math.log10((double)13168375/4224127912L)    // use a long literal  
 Math.log10(13168375.0/4224127912L)          // use a long literal

没有overflow

这里没有任何对数是“大”的。

【讨论】:

  • @GriffeyDog 嘿,谢谢 - 我正专注于避免错误消息。我也在第一个数字上添加了一个“.0”。
猜你喜欢
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 2011-06-27
  • 2017-08-28
  • 2018-04-13
相关资源
最近更新 更多