# The built-in complex division is unreasonably slow

**URL:** https://discourse.julialang.org/t/the-built-in-complex-division-is-unreasonably-slow/91026
**Category:** Performance
**Created:** [November 30, 2022, 3:14am UTC](https://discourse.julialang.org/t/the-built-in-complex-division-is-unreasonably-slow/91026 "2022-11-30T03:14:27Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![photor](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/photor/32/14343_2.png) [@photor](https://discourse.julialang.org/u/photor)
#### Post date: [November 30, 2022, 3:14am UTC](https://discourse.julialang.org/t/the-built-in-complex-division-is-unreasonably-slow/91026/1 "2022-11-30T03:14:27Z")

</div>

```julia
@btime x/y setup=(x=rand(ComplexF64);y=rand(ComplexF64));

```

gives

```julia
9.853 ns (0 allocations: 0 bytes)

```

while

```julia
function frac(x::ComplexF64, y::ComplexF64)
    y2=y.re^2+y.im^2
    return Complex((x.re*y.re+x.im*y.im)/y2, (x.im*y.re-x.re*y.im)/y2)
end

@btime frac(x,y) setup=(x=rand(ComplexF64);y=rand(ComplexF64));

```

gives only

```julia
3.694 ns (0 allocations: 0 bytes)

```

Why?

---

<div class="post-metadata">

### Author: ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)
#### Post date: [November 30, 2022, 3:19am UTC](https://discourse.julialang.org/t/the-built-in-complex-division-is-unreasonably-slow/91026/2 "2022-11-30T03:19:25Z")

</div>

the short answer is getting good accuracy for these is hard. If you look at `@btime @fastmath x/y` you’ll see faster results results.

---

<div class="post-metadata">

### Author: ![mikmoore](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mikmoore/32/31109_2.png) [@mikmoore](https://discourse.julialang.org/u/mikmoore)
#### Post date: [November 30, 2022, 5:10pm UTC](https://discourse.julialang.org/t/the-built-in-complex-division-is-unreasonably-slow/91026/3 "2022-11-30T17:10:15Z")

</div>

To elaborate just a little: the extra runtime is spent ensuring proper behavior for `Inf` and for cases where intermediate quantities (such as your `y2=y.re^2+y.im^2`) would over/underflow. You can take a look at the current implementation in [the source code](https://github.com/JuliaLang/julia/blob/master/base/complex.jl#L391).

---

<div class="post-metadata">

### Author: ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)
#### Post date: [November 30, 2022, 5:13pm UTC](https://discourse.julialang.org/t/the-built-in-complex-division-is-unreasonably-slow/91026/4 "2022-11-30T17:13:29Z")

</div>

It might be possible to add a better fast path (similar to [faster `inv` for normal sized `ComplexF64` by oscardssmith · Pull Request #47255 · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/pull/47255)).
