Compiler output type

49 views
Skip to first unread message

Harvey P. Dale

unread,
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

unread,
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

unread,
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
Reply all
Reply to author
Forward
0 new messages