Skip to content

integer

Kyle Baron edited this page Sep 2, 2016 · 1 revision

Integer division in C++

library(mrgsolve)
library(dplyr)
library(knitr)
opts_chunk$set(comment='.')

Create an mrgsolve model to illustrate the consequences of dividing two integers in C++

  • int creates integer variable
  • double creates double precision variables
  • mrgsolve parameters are doubles
code <- '
$PARAM p = 12.0, J = 7/6

$TABLE
double d = 1.1;
int i = 5;
int ii  = 3;

double A = d/i;
double B = i/ii;
double C = p/i;
double D = p/5.6;
double E = p/7;
double F = 7/6;
double G = 7.0/6.0;
double H = 7.1/5;
double I = d + 9;


$CAPTURE >> annotated=TRUE
A: double divided by integer [0.22]
B: integer divided by integer [1.666667]
C: parameter divided by integer [2.4]
D: parameter divided by double literal [2.142857]
E: parameter divided by integer literal [1.714286]
F: integer literal divided by integer literal [1.166667]
G: double literal divided by double literal [1.166667]
H: double literal divided by integer literal [1.42]
I: add double and integer literal [10.1]
J: parameter set to 7/6 [1.166667]

'

Compile the model, run and arrange results

The results

df %>% 
  mutate(C_result=value) %>% 
  kable
name descr R_result C_result
A double divided by integer 0.22 0.220000
B integer divided by integer 1.666667 1.000000
C parameter divided by integer 2.4 2.400000
D parameter divided by double literal 2.142857 2.142857
E parameter divided by integer literal 1.714286 1.714286
F integer literal divided by integer literal 1.166667 1.000000
G double literal divided by double literal 1.166667 1.166667
H double literal divided by integer literal 1.42 1.420000
I add double and integer literal 10.1 10.100000
J parameter set to 7/6 1.166667 1.166667

Conclusions

  • Writing numbers in C++ like 9 or 1 result in integer literals
  • Writing numbers in C++ like 9.0 or 1.0 or 9.333 result in double literals
  • Dividing two integers (literal or not) results in an integer
    • This may not be what you are intending and the result may be different that what you see in R
  • Dividing and integer by double or double by integer results in double
  • In mrgsolve, parameter values are coded to be doubles
  • It is considered safe practice to include one decimal place when using literal numbers that are intended to be double precision
    • For example, it is safer to write DAY/24.0 rather than DAY/24
  • Expressions entered in $PARAM always get evaluated by the R intepreter; expect the R result