13

1

According to List of compilable functions, `Erf`

and `Erfc`

are compilable functions.

However, I want to make a compiled version of the `PDF`

of a `VoigtDistribution`

to use in a `NonlinearModelFit`

, and it doesn't seem that the `Erfc`

of a complex value will compile:

```
funcReal =
Compile[{{x, _Real}}, Erfc[x I], CompilationTarget -> "C",
RuntimeOptions -> "Speed"]
funcComplex =
Compile[{{x, _Complex}}, Erfc[x I], CompilationTarget -> "C",
RuntimeOptions -> "Speed"]
Needs["CompiledFunctionTools`"];
CompilePrint[funcReal] (*same as funcComplex*)
1 argument
2 Real registers
4 Complex registers
Underflow checking off
Overflow checking off
Integer overflow checking off
RuntimeAttributes -> {}
R0 = A1
C0 = 0. + 1. I
R1 = 0.
Result = C3
1 C1 = R0 + R1 I
2 C1 = C1 * C0
3 C2 = R0 + R1 I
4 C2 = C2 * C0
5 C3 = MainEvaluate[ Hold[Erfc][ C2]]
6 Return
```

Note the call to `MainEvaluate`

:

```
Erfc[I] // N
funcReal[1]
funcComplex[1]
1. - 1.65043 I
1. - 1.65043 I
1. - 1.65043 I
```

All the functions work, but because of the `MainEvaluate`

, they offer no performance benefit. How can I compile this function? Is this possible? Is there an alternative formula I could use?

Removing the `CompilationTarget`

doesn't solve the problem either.

3They compile for real values, but do not appear to compile for complex arguments. – asim – 2013-02-20T17:56:50.377

1Look at e.g.

`Plot3D[Arg@Erf[x + I y], {x, -5, 5}, {y, -5, 5}]`

. This is not a function you would probably wish to try to find an alternative formula for, even approximately. – Oleksandr R. – 2013-02-20T18:25:59.3871

On the other hand, regarding the PDF of the Voigt distribution: http://dx.doi.org/10.1016/0368-2048(94)02189-7

– Oleksandr R. – 2013-02-20T18:46:33.120