spire.math

FastComplex

object FastComplex

FastComplex is an ugly, beautiful hack.

The basic idea is to encode two 32-bit Floats into a single 64-bit Long. The lower-32 bits are the "real" Float and the upper-32 are the "imaginary" Float.

Since we're overloading the meaning of Long, all the operations have to be defined on the FastComplex object, meaning the syntax for using this is a bit ugly. To add to the ugly beauty of the whole thing I could imagine defining implicit operators on Long like +@, -@, *@, /@, etc.

You might wonder why it's even worth doing this. The answer is that when you need to allocate an array of e.g. 10-20 million complex numbers, the GC overhead of using *any* object is HUGE. Since we can't build our own "pass-by-value" types on the JVM we are stuck doing an encoding like this.

Here are some profiling numbers for summing an array of complex numbers, timed against a concrete case class implementation using Float (in ms):

size | encoded | class 1M | 5.1 | 5.8 5M | 28.5 | 91.7 10M | 67.7 | 828.1 20M | 228.0 | 2687.0

Not bad, eh?

Linear Supertypes
AnyRef, Any
Ordering
  1. Alphabetic
  2. By inheritance
Inherited
  1. FastComplex
  2. AnyRef
  3. Any
  1. Hide All
  2. Show all
Learn more about member selection
Visibility
  1. Public
  2. All

Value Members

  1. final def !=(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  2. final def !=(arg0: Any): Boolean

    Definition Classes
    Any
  3. final def ##(): Int

    Definition Classes
    AnyRef → Any
  4. final def ==(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  5. final def ==(arg0: Any): Boolean

    Definition Classes
    Any
  6. final def abs(d: Long): Float

  7. final def add(a: Long, b: Long): Long

  8. final def angle(d: Long): Float

  9. final def apply(real: Double, imag: Double): Long

  10. final def apply(real: Float, imag: Float): Long

  11. final def asInstanceOf[T0]: T0

    Definition Classes
    Any
  12. final def bits(n: Int): Float

    Annotations
    @inline()
  13. final def bits(n: Float): Int

    Annotations
    @inline()
  14. def clone(): AnyRef

    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws()
  15. final def complexSignum(d: Long): Long

  16. final def conjugate(d: Long): Long

  17. final def decode(d: Long): (Float, Float)

  18. final def divide(a: Long, b: Long): Long

  19. final def encode(real: Float, imag: Float): Long

    Annotations
    @inline()
  20. final def eq(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  21. def equals(arg0: Any): Boolean

    Definition Classes
    AnyRef → Any
  22. def finalize(): Unit

    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws()
  23. final def getClass(): Class[_]

    Definition Classes
    AnyRef → Any
  24. def hashCode(): Int

    Definition Classes
    AnyRef → Any
  25. final val i: Long

  26. final def imag(d: Long): Float

    Annotations
    @inline()
  27. final def isInstanceOf[T0]: Boolean

    Definition Classes
    Any
  28. final def isWhole(d: Long): Boolean

  29. def mod(a: Long, b: Long): Long

  30. final def multiply(a: Long, b: Long): Long

  31. final def ne(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  32. final def negate(a: Long): Long

  33. final def notify(): Unit

    Definition Classes
    AnyRef
  34. final def notifyAll(): Unit

    Definition Classes
    AnyRef
  35. final val one: Long

  36. final def polar(magnitude: Float, angle: Float): Long

    Annotations
    @inline()
  37. final def pow(a: Long, b: Long): Long

  38. def quot(a: Long, b: Long): Long

  39. def quotmod(a: Long, b: Long): (Long, Long)

  40. final def real(d: Long): Float

    Annotations
    @inline()
  41. final def signum(d: Long): Int

  42. final def subtract(a: Long, b: Long): Long

  43. final def synchronized[T0](arg0: ⇒ T0): T0

    Definition Classes
    AnyRef
  44. final def toRepr(d: Long): String

  45. def toString(): String

    Definition Classes
    AnyRef → Any
  46. final def wait(): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws()
  47. final def wait(arg0: Long, arg1: Int): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws()
  48. final def wait(arg0: Long): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws()
  49. final val zero: Long

Inherited from AnyRef

Inherited from Any

Ungrouped