# Compiler output type

53 views

### Harvey P. Dale

May 12, 2014, 12:43:21 AM5/12/14
to
Some compiled functions yield reals even if the input and necessary output are integers. How can I force the output to be an integer rather than a real in such cases? To be clear, not all compiled program output produces reals; some compiled programs, given integer inputs, produce integer outputs. But some do not. An example is:

collatz = Compile[{{n, _Integer}}, If[EvenQ[n], n/2, 3 n + 1]]

It produces real rather than integer output, and I'd like to force integer output if possible.

Thanks

Best,

Harvey

### Daniel

May 12, 2014, 10:26:32 PM5/12/14
to
This will do the trick:
collatz = Compile[{{n, _Integer}}, If[EvenQ[n], n/2, 3 n + 1]//Round]

I think that the problem is with n/2. Although the result is guaranteed to be integer, the compiler cannot analyze the code and know it, so the output is set to Real.

### Bob Hanlon

May 12, 2014, 10:26:52 PM5/12/14
to

collatz = Compile[{{n, _Integer}}, If[EvenQ[n], n/2, 3 n + 1] //
IntegerPart];

collatz2 = Compile[{{n, _Integer}}, If[EvenQ[n], n/2, 3 n + 1] // Round];

m = 1000000;

Timing[t1 = Table[collatz[n], {n, m}];]

{0.291132, Null}

Timing[t2 = Table[collatz2[n], {n, m}];]

{0.322116, Null}

Timing[t3 = Table[If[EvenQ[n], n/2, 3 n + 1], {n, m}];]

{2.352646, Null}

t1 == t2 == t3

True

Bob Hanlon

On Mon, May 12, 2014 at 12:43 AM, Harvey P. Dale <h...@hpdale.org> wrote:

> Some compiled functions yield reals even if the input and