# \`cispi\` is not accurate

**URL:** <https://discourse.julialang.org/t/cispi-is-not-accurate/83811>\
**Category:** General Usage\
**Created:** [July 6, 2022, 12:39am UTC](https://discourse.julialang.org/t/cispi-is-not-accurate/83811 "2022-07-06T00:39:24Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![\_stla](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/_stla/32/35613_2.png) [@\_stla](https://discourse.julialang.org/u/_stla)\
**Post date:** [July 6, 2022, 12:39am UTC](https://discourse.julialang.org/t/cispi-is-not-accurate/83811/1 "2022-07-06T00:39:24Z")

</div>

In a package of mine, I replaced every occurrence of `exp(1im*pi*z)` with `cispi(z)`. Then one of my unit tests has failed, and this test is a comparison of the evaluation of a special function to the exact value. There were differences after the sixth or seventh decimal digit. Then I believe that `cispi` is not accurate.

An example, but this is less striking on this example:

```julia
julia> cispi(1im)
0.04321391826377052 + 0.0im

julia> exp(-pi)
0.04321391826377226

```

The second one is closer to Wolfram:

`0.04321391826377224977...`

---

<div class="post-metadata">

**Author:** ![babaq](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/babaq/32/891_2.png) [@babaq](https://discourse.julialang.org/u/babaq)\
**Post date:** [July 6, 2022, 12:50am UTC](https://discourse.julialang.org/t/cispi-is-not-accurate/83811/4 "2022-07-06T00:50:38Z")

</div>

`cis` may not as accurate as `exp(im*z)`, in `circstats.jl`, `cis` could make `acos` [domain error](https://github.com/circstat/CircStats.jl/pull/8/files).

---

<div class="post-metadata">

**Author:** ![Benny](https://avatars.discourse-cdn.com/v4/letter/b/49beb7/32.png) [@Benny](https://discourse.julialang.org/u/Benny)\
**Post date:** [July 6, 2022, 5:57am UTC](https://discourse.julialang.org/t/cispi-is-not-accurate/83811/5 "2022-07-06T05:57:24Z")

</div>

Interestingly, you get the Wolfram figure if you work with BigFloat. Not sure if the pi digits are right, didn’t find unspaced text for comparison.  
Round 2 per @longemen3000’s fix:

```julia
julia> typeof(pi), typeof(-pi) # need to watch out for conversions
(Irrational{:π}, Float64)

julia> setprecision(1000) # must do this to avoid precision loss in methods
1000

julia> bigpi = BigFloat(pi) # prints only 302 digits
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412736

julia> exp(-bigpi) # prints only 305 digits
0.0432139182637722497744177371717280112757281098106330829807196874010507657570179676981399599619010843870168069645976620563265198317796586642654589470487654217430533893968290178108479426940587436021700979589304669505133081686070687502355832976249027608734841817238797966968412751519595753314335315085890095

julia> precision(bigpi), precision(-bigpi), precision(exp(-bigpi))
(1000, 1000, 1000)

Wolfram Alpha> N[Exp[-Pi], 143] # evaluates expression with 143-digit precision
0.0432139182637722497744177371717280112757281098106330829807196874010507657570179676981399599619010843870168069645976620563265198

julia> cis(pi*im) # real part is exp(-pi)
0.04321391826377226 + 0.0im

julia> cispi(1im)
0.04321391826377052 + 0.0im

```

---

<div class="post-metadata">

**Author:** ![longemen3000](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/longemen3000/32/7298_2.png) [@longemen3000](https://discourse.julialang.org/u/longemen3000)\
**Post date:** [July 6, 2022, 6:11am UTC](https://discourse.julialang.org/t/cispi-is-not-accurate/83811/6 "2022-07-06T06:11:56Z")

</div>

the precision on `BigFloat` needs to be set on a global level, via `setprecision`:

```julia
julia> setprecision(1000)
1000
julia> bigpi = big(pi)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412736
julia> precision(-bigpi)
1000

```

---

<div class="post-metadata">

**Author:** ![antoine-levitt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/antoine-levitt/32/4008_2.png) [@antoine-levitt](https://discourse.julialang.org/u/antoine-levitt)\
**Post date:** [July 6, 2022, 7:59am UTC](https://discourse.julialang.org/t/cispi-is-not-accurate/83811/7 "2022-07-06T07:59:07Z")

</div>

Indeed, cis and cispi don’t match in how they’re computed for complex z. cis(z) factors out the imaginary part and calls cis on real(z), while cispi(z) calls `sincospi` on the complex z directly, which here incurs a loss of precision by cancellation. I’ve submitted a fix here: [Better precision for cispi(::Complex) by antoine-levitt · Pull Request #45945 · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/pull/45945)

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [July 6, 2022, 9:30am UTC](https://discourse.julialang.org/t/cispi-is-not-accurate/83811/8 "2022-07-06T09:30:49Z")

</div>

> [@\_stla](#):
>
> I replaced every occurrence of `exp(1im*pi*z)` with `cispi(z)`.

I thought `cis`/`cispi` was only supposed to be an advantage for `Real` inputs. Why use them on complex data?

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [July 6, 2022, 2:27pm UTC](https://discourse.julialang.org/t/cispi-is-not-accurate/83811/9 "2022-07-06T14:27:21Z")

</div>

> [@DNF](#):
>
> Why use them on complex data?

Should be faster as it computes sines and cosines at the same time.
