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: Any): Boolean

    Definition Classes
    AnyRef → Any
  2. final def ##(): Int

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

    Definition Classes
    AnyRef → Any
  4. final def abs(d: Long): Float

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

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

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

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

  9. final def asInstanceOf[T0]: T0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  27. final def mod(a: Long, b: Long): Long

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

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

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

  31. final def notify(): Unit

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

    Definition Classes
    AnyRef
  33. final val one: Long

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

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

  36. final def quot(a: Long, b: Long): Long

  37. final def quotmod(a: Long, b: Long): (Long, Long)

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

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

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

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

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

  43. def toString(): String

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

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

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

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

Inherited from AnyRef

Inherited from Any

Ungrouped