Компромисс, который поставляется с использованием BigDecimal, а не в двойной на Java

StackOverflow https://stackoverflow.com/questions/1972863

Вопрос

Я пишу код для нейронной сети, и мне интересно, должен ли я это сделать или нет. Я на самом деле несколько обеспокоен тем, что даже использование 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 десятичных цифр точности. Причина, по которой ваша сеть не ведет себя, поскольку она должна, вероятно, не имеет ничего общего с точностью. ИМО, это, скорее всего, связано с тем, что «реальные» нейронные сети не всегда ведут себя так, как они должны.

Сделайте свои собственные тесты и решайте, исходя из этого ... это ничего не означает «то, что говорят люди».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top