1

使用 Java 学习“数字运算”的最佳资源是什么?我指的是诸如十进制数字处理的正确方法、最佳实践、API、性能方面的著名习语和使用 Java 进行数字处理编码时的常见缺陷(及其解决方案)。

4

2 回答 2

1

这个问题似乎有点开放式,可以解释。因此,我将仅提供两点简短的内容。

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

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

如果您研究数字的计算机表示或数字的二进制表示,您会认为这样的东西是一种副作用。

于 2011-07-06T22:12:59.483 回答
1

首先,您应该了解浮点数学。这不是特定于 java 的,但它可以让您稍后做出明智的决定,例如,何时可以使用 和 等 Java 原floatdouble相关主题包括(从我参加的科学计算课程中复制):

  1. 误差来源:舍入、截断误差、不完全收敛、统计误差、程序错误。
  2. 计算机浮点运算和 IEEE 标准。
  3. 通过抵消放大误差。
  4. 调节、条件数和误差放大。

这会引导您决定是否使用 Java 的BigDecimalBigInteger等。关于这点已经有很多问题答案了。

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

最后,在可能的情况下,使用库来存储数字内容通常是值得的。您的第一次尝试可能会比现有库更慢且错误更多。例如,看在上帝的份上,不要实现自己的线性编程例程。

于 2011-07-06T22:18:04.160 回答