Ресурсы Java, чтобы сделать сокращение чисел?

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

2 ответа

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

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

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

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

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

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

Это приводит вас к решению о том, использовать ли Java BigDecimal, BigIntegerи т. д. Уже есть много вопросов и ответов по этому поводу.

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

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

Другие вопросы по тегам