Компромисс, который поставляется с использованием BigDecimal, а не в двойной на Java
-
21-09-2019 - |
Вопрос
Я пишу код для нейронной сети, и мне интересно, должен ли я это сделать или нет. Я на самом деле несколько обеспокоен тем, что даже использование Double может не иметь хороших результатов и что мне, возможно, придется перенести свой код на более эффективный язык, например C ++. Я прочитал здесь, что BigDecimal в 1000 раз медленнее, чем вдвое? Это много.
С другой стороны, я собираюсь много работать с десятичными числами, и их всегда будет хорошим. Я не могу действительно сказать, может ли точность вызвать проблемы с этим. Я не думаю, что какая -либо из реализаций, которые я видел, делаю это, так что я, вероятно, не собираюсь этого делать. Хотя иногда сеть не ведет себя так, как должна; Я не уверен, что это точная ошибка или проблема с его логикой.
Но мне интересно, вы, ребята, используете Bigdecimal только при работе с деньгами? Есть мысли об этом?
Решение
Используя Java's double
Тип данных для весов в нейронной сети кажется очень уместным. Это хороший выбор для инженерных и научных приложений.
Нейронные сети по своей природе приблизительны. Точность BigDecimal
в этом приложении было бы бессмысленно, влияет на производительность. Бронировать BigDecimal
в первую очередь для финансовых приложений.
Другие советы
Я использую целые числа/длины при работе с деньгами, потому что использование какого -либо десятичного представления абсурдно. Вы обязательно не должны использовать удвоение, и есть несколько библиотек, которые вы можете посмотреть.
Однако, как я помню, библиотеки денег незрелые или недоразвитые.
Целые числа для целых и дробных значений в сочетании с валютой - это путь. Либо найти библиотеку, либо написать свою собственную.
Вы не должны абсолютно использовать десятичные цифры с плавающей запятой для сумм с фиксированной точкой - например, валюта.
В прошлом я использовал нестандартный денежный класс, который просто завершает значительный экземпляр - он работал хорошо и не имеет проблем.
Люди не Просто используйте BigDecimal
/ BigInteger
за деньги. Скорее они используют их в приложениях, которые нуждаются в большей точности, чем доступны, используя double
или же long
.
Конечно, использование BigDecimal
а также BigInteger
Поступает за счет гораздо более медленных арифметических операций. Например, добавление большого числа O(N)
куда N
количество значимых цифр в количестве, а умножение O(N**2)
.
Итак, способ решить, использовать ли long
/ double
Или их «большие» аналоги состоит в том, чтобы взглянуть на то, насколько точно ваше приложение действительно нужно. Денежные приложения действительно должны иметь возможность представлять ценности, не теряя ни одного цента. Другие приложения одинаково чувствительны к точности.
Но, честно говоря, я не думаю, что приложению нейронной сети требуется 13 десятичных цифр точности. Причина, по которой ваша сеть не ведет себя, поскольку она должна, вероятно, не имеет ничего общего с точностью. ИМО, это, скорее всего, связано с тем, что «реальные» нейронные сети не всегда ведут себя так, как они должны.
Сделайте свои собственные тесты и решайте, исходя из этого ... это ничего не означает «то, что говорят люди».