Skip to content

Number representations

The package is designed to work with complex numbers in different formats, including the native Complex type and the Polar and Spherical types from the ComplexValues package. The package re-exports these types, so you can use them directly.

julia
seg = Segment(0, Polar(3, π/4))
point(seg, (0:4)/4)
5-element Vector{Polar{Float64}}:
   Complex Polar: (modulus = 0.0, angle = 0.0⋅π)
 Complex Polar: (modulus = 0.75, angle = 0.25⋅π)
  Complex Polar: (modulus = 1.5, angle = 0.25⋅π)
 Complex Polar: (modulus = 2.25, angle = 0.25⋅π)
  Complex Polar: (modulus = 3.0, angle = 0.25⋅π)
julia
Complex.(ans)
5-element Vector{ComplexF64}:
                0.0 + 0.0im
 0.5303300858899107 + 0.5303300858899106im
 1.0606601717798214 + 1.0606601717798212im
 1.5909902576697321 + 1.590990257669732im
  2.121320343559643 + 2.1213203435596424im

In addition, the package supports different floating-point types underlying any of the complex number types. This means you can use BigFloats or DoubleFloats to get higher precision.

julia
using DoubleFloats
seg = Segment{DoubleFloat}(-1, 1)
seg(2//3)
3.33333333333333333333333333333332306e-01

Working in higher precision can be tricky: if you ever use a standard Float64 value, it will set a ceiling on the precision of the result. For example, the following code will not give you the expected result:

julia
seg(2/3)
0.33333333333333326

As above, you can use Rational types to avoid premature floating-point conversion, or perform the conversions prior to calls:

julia
seg(DoubleFloat(2) / 3)
3.33333333333333333333333333333329225e-01

Naturally, though, many powers of two can be converted correctly into higher precision without loss:

julia
seg(1//8) - seg(0.125)
0.0

Curves, paths, and regions can be constructed with an explicit AbstractFloat type in braces. If the type is not given, the constructor will use the highest precision of its arguments, or default to Float64 if the inputs are integers or rationals.

julia
setprecision(100)
cir = Circle(BigFloat(1) / 5, 1//5)
Circle{BigFloat} in the complex plane:
   centered at (0.20000000000000000000000000000004 + 0.0im) with radius 0.20000000000000000000000000000004, positively oriented

Again, note the effect of premature float casting:

julia
Circle(BigFloat(1) / 5, 1/5)
Circle{BigFloat} in the complex plane:
   centered at (0.20000000000000000000000000000004 + 0.0im) with radius 0.20000000000000001110223024625157, positively oriented