Ресурсы Java, чтобы сделать хруст? - PullRequest
1 голос
/ 07 июля 2011

Каковы лучшие ресурсы по изучению «перебора чисел» с использованием Java?Я имею в виду такие вещи, как правильные методы обработки десятичных чисел, лучшие практики, API, известные идиомы производительности и распространенные ошибки (и их решения) при кодировании для обработки чисел с использованием Java.

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Во-первых, вы должны узнать о математике с плавающей точкой. Это не относится к java, но позволит вам принимать обоснованные решения позже, например, когда будет нормально использовать примитивы Java, такие как float и double. Соответствующие темы включают (скопировано с курса, который я изучал в области научных вычислений ):

  1. Источники ошибок: округление, ошибка усечения, неполная сходимость, статистическая ошибка, программная ошибка.
  2. Компьютерная арифметика с плавающей точкой и стандарт IEEE.
  3. Ошибка усиления при отмене.
  4. Кондиционирование, номер условия и усиление ошибки.

Это приводит вас к принятию решения о том, использовать ли Java BigDecimal, BigInteger и т. Д. Существует множество вопросов и ответов об этом уже.

Далее вы достигнете производительности, включая как процессор, так и память. Вы, вероятно, найдете различные практические правила, такие как «автобоксирование - серьезная проблема с производительностью». Но, как всегда, лучшее, что нужно сделать, это профилировать свое собственное приложение. Например, скажем, кто-то настаивает, что некоторая оптимизация важна, даже если она влияет на удобочитаемость. Если эта оптимизация не имеет значения для вашего приложения, не делайте этого!

Наконец, где это возможно, часто полезно использовать библиотеку для числовых операций. Ваша первая попытка, вероятно, будет медленнее и более ошибочной, чем существующие библиотеки. Например, ради бога, не реализуйте свою собственную процедуру линейного программирования.

1 голос
/ 07 июля 2011

Этот вопрос кажется немного открытым и открытым для интерпретации.Поэтому я просто дам две короткие вещи:

1) Десятичная точность - никогда не предполагайте, что два числа с плавающей запятой (или двойные) равны, даже если вы выполнили одинаковые шаги для вычисления их обоих.Из-за ряда проблем с округлением в различных ситуациях вы часто не можете быть уверены, что десятичное число - это именно то, что вы ожидаете.Если вы делаете double myNumber = calculateMyNumber(), а затем делаете кучу вещей, а затем возвращаетесь к нему и проверяете if(myNumber == calculateMyNumber(), эта оценка может быть ложной, даже если вы не изменили вычисления, выполненные в CalculateMyNumber ()

2) Существуют ограничения в размере и точности чисел, которые вы можете отслеживать.Если у вас есть int myNumber = 2000000000 и if(myNumber*2 < myNumber), это на самом деле будет иметь значение true, поскольку myNumber * 2 приведет к числу, меньшему, чем myNumber, поскольку память, выделенная для этого числа, не достаточно велика, чтобы вместить такое большое число ионо переполнится и станет меньше, чем было раньше.Посмотрите на классы, которые инкапсулируют большие числа, такие как BigInteger и BigDecimal .

Вы разберетесь в подобных вещах как побочный эффект, если изучите компьютерные представлениячисла или двоичные представления чисел.

...