LINUX.ORG.RU

Комплексные числа в scala

 , ,


0

2

Есть ли годная библиотека? «Батареек» в самом ЯП, то есть в стандартной библиотеке для этого нет, видимо, посчитали ненужным?

Да, я знаю, что можно написать свои, и даже в каждом втором учебнике это хороший пример, как в scala можно создавать свои типы, которые работают как «родные» в языке... по той логике что угодно можно написать.

Скорее всего придётся писать свои, но вдруг всё-таки есть библиотека (не стандартная, но может «общеупотребимая»?), где помимо комплексных чисел найдётся каких-то полезных плюшек типа быстрого преобразования Фурье, парочку рутин линейной алгебры или набора специальных функций?

В python вот, например, комплексные числа - часть языка, и ещё есть numpy, а кому мало - scipy, и ещё matplotlib. Но в python нет инкапсуляции, нет TCO, убогие анонимные функции... короче, не нравится он мне. Зато «батареек» хватает, да.

UPDATED: spire-math выглядит как то, что доктор прописал, но если вдруг кто считает что-то лучше - можете кидаться ссылками, вдруг кому ещё будет полезно.

Любая джавашная реализация. Сверху можешь нагородить оберток для удобства, чтобы не а.плюс(б), а а + б было.

cdshines ★★★★★ ()
Ответ на: комментарий от anonymous

Фига се, даже кватернионы есть (вряд ли они мне нужны, но раз есть, значит, кто-то действительно потел над той библиотекой).

Благодарю, будет круто, если ещё и через sbt подрубится.

BattleCoder ★★★★★ ()
Ответ на: комментарий от BattleCoder

Фига се, даже кватернионы есть

Кватернионы как раз на практике гораздо чаще используются в алгоритмах.

mix_mix ★★★★★ ()
Ответ на: комментарий от mix_mix

гораздо чаще

это слишком сильное утверждение. чуть менее, чем всей пользы кватернионов для алгоритмов - накрытие SU(2) -> SO(3)

jtootf ★★★★★ ()

Есть ли годная библиотека?

А разве в Scala на JVM можно получить эффективные и удобные комплексные числа? Все же будет аллоцироваться в heap с лишней косвенностью как вот здесь.

kamre ★★★ ()
Ответ на: комментарий от kamre

Сейчас производительность играет не первую роль. Более того, скорее всего она не будет играть никакой роли в моей задаче.

BattleCoder ★★★★★ ()
Ответ на: комментарий от cdshines

spire ближе к scala, а это всё-таки java. ну как вариант, если по какой-то причине нельзя использовать scala, но нужно для java, да...

BattleCoder ★★★★★ ()
Ответ на: комментарий от BattleCoder

Я вообще не вижу разницы. В конце-концов, получаешь один и тот же результат. Особенно на фоне твоего «самому писать, чтоб не тянуть из джавы». Тоже мне, выбираешь из сортов гогна)

cdshines ★★★★★ ()
Ответ на: комментарий от cdshines

Ну продвинутая система типов же. Я пока не разобрался, как мне сделать Complex, для действительной и мнимой части чтобы было что-то отличное от Float или Double, но сутя по тому, что тип параметризованный, это таки возможно...

BattleCoder ★★★★★ ()
Ответ на: комментарий от cdshines

Да пока уже никакой не нужен... я «заморозил» эту задачу. Думал, вместо чисел с плавающей точкой сделать что-то вроде точного представления, но для ограниченного подмножества вещественных чисел (не всех).

Потом подумал получше и понял, что мне эти числа (в том числе и комплексные) вообще не впились, и всё можно сделать проще. Но комплексные числа в будущем таки могут пригодиться... потому библиотеки в «закладки». И одну и вторую.

Подробнее про задачу распинаться не хочется... надолго затянется.

BattleCoder ★★★★★ ()
Ответ на: комментарий от BattleCoder

А вот, кстати, и минус того, что в скале нет четко фиксированных операций. Если делаешь параметризованный тип, то остается лишь надеяться на то, что тот, кто захочет зафигачить в него что-то, подгонит контракт этого чего-то под внутреннюю реализацию => поломанная инкапсуляция и вообще.

Я имею в виду вот что:

final case class Complex[@spec(Float, Double) T](real: T, imag: T)(implicit f: Fractional[T], t: Trig[T], r: IsReal[T])
    extends ScalaNumber with ScalaNumericConversions with Serializable {
    def +(b: T): Complex[T] = new Complex(real + b, imag)

То есть, если захочешь Complex[MyRational], то у нас одна надежда - что MyRational реализует, например, + так, как ожидалось. Поэтому BigInteger сюда уже не прецепишь, а придется цеплять BigInt-обертку. Ну и т. д.

cdshines ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.