Java资源做数字运算?

时间:2011-07-06 21:53:28

标签: java numerics

使用Java学习'数字运算'的最佳资源是什么?我指的是十进制数处理的正确方法,最佳实践,API,性能的显着习惯和常见的陷阱(及其解决方案),同时使用Java编码数字处理。

2 个答案:

答案 0 :(得分:1)

这个问题似乎有点开放,可以解释。因此,我只会提供两件简短的事情。

1)十进制精度 - 永远不要假设两个浮点(或双精度)数相等,即使你经历了完全相同的步骤来计算它们。由于在各种情况下四舍五入的许多问题,您通常无法确定十进制数字正是您所期望的。如果你执行double myNumber = calculateMyNumber()然后做了很多事情,然后回到它并检查if(myNumber == calculateMyNumber(),即使你没有改变在calculateMyNumber()中完成的计算,该评估也可能是假的

2)您可以跟踪的数字大小和精度有限制。如果您有int myNumber = 2000000000if(myNumber*2 < myNumber),那么实际上会评估为true,因为myNumber * 2将导致小于myNumber的数字,因为为该数字分配的内存不足以容纳数量很大,它会溢出,变得比以前小。查看封装大数字的类,例如BigIntegerBigDecimal

如果你研究数字的计算机表示或数字的二进制表示,你会把这样的东西视为副作用。

答案 1 :(得分:1)

首先,您应该了解浮点数学。这不是特定于java,但它允许您稍后做出明智的决定,例如,何时可以使用floatdouble等Java原语。相关主题包括(从a course that I took on scientific computing复制):

  1. 错误来源:舍入,截断错误,不完全收敛,统计错误, 程序错误。
  2. 计算机浮点运算和IEEE标准。
  3. 通过取消进行错误放大。
  4. 调节,条件编号和误差放大。
  5. 这会让您决定是否使用Java的BigDecimalBigInteger等。已经有很多关于此问题的questionsanswers

    接下来,您将获得性能,包括CPU和内存。你可能会发现各种经验法则,例如“很多自动装箱是一个严重的性能问题”。但与往常一样,最好的办法是分析您自己的应用程序。例如,假设有人坚持认为某些优化很重要,即使它会影响易读性。如果优化对您的应用程序无关紧要,那就不要这样做了!

    最后,在可能的情况下,使用库来获取数字通常是值得的。您的第一次尝试可能比现有的库更慢,更多。例如,为了善良,请不要实现自己的线性编程例程。