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.
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. Feb 20 '13 at 18:25