1. ## floating exception problems

hello! I am fairly new to C and am trying to write a code that solves ODEs and graphs them. I seem to have run into a "floating exception". I have been using gdb but I don't think I fully understand what it is telling me/how to go about fixing it. Any help would be great!

My code is below thanks!

Code:
```#include <stdio.h>
#include <math.h>
#include "cpgplot.h"

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//DEFINE DIFFERENTIAL EQUATIONS
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

float dSdt(float B, float N, float I, float S)
{
return (-((B/N)*I)*S);
}
float dIdt(float y, float B, float N, float I, float S)
{
return ((B/N)*I*S)-y*I;
}
float dRdt(float y, float I)
{
return y*I;
}

int main (){

//~~~~~~~~~~~~~~~~~~~~~
//RUNGE KUTTA
//~~~~~~~~~~~~~~~~~~~~~~

int DAYS = 15;
int i;
float t[i];
t[0]=0.;
int n = 100;

// step height h
float h = (float)DAYS/(float)n;

//rk
float Sk1,Ik1,Rk1;
float Sk2,Ik2,Rk2;
float Sk3,Ik3,Rk3;
float Sk4,Ik4,Rk4;

//define arrays i need to graph at end
float S[n];
float I[n];
float R[n];

//define and set parameters
float u=0.02;
float y=36.;
float B=10.;

const float N = 100;

//set initial conditions
S[0]=30.;
I[0]=30.;
R[0]=40.;

// Apply Runge Kutta
for (i=1; i<=n; i++)
{

//k1
Sk1 = h*dSdt(N,B,S[i-1],I[i-1]);
Ik1 = h*dIdt(y,B,N,I[i-1],S[i-1]);
Rk1 = h*dRdt(y,I[i-1]);

//k2
Sk2 = h*dSdt(N,B,I[i-1] + 0.5*Ik1, S[i-1] + 0.5*Sk1);
Ik2 = h*dIdt(y,B,N,I[i-1]+ 0.5*Ik1,S[i-1] + 0.5*Sk1);
Rk2 = h*dRdt(y,I[i-1]+ 0.5*Ik1);

//k3
Sk3 = h*dSdt(N,B,S[i-1]+ 0.5*Sk2,I[i-1]+ 0.5*Ik2);
Ik3 = h*dIdt(y,B,N,I[i-1]+ 0.5*Ik2,S[i-1]+ 0.5*Sk2);
Rk3 = h*dRdt(y,I[i-1]+ 0.5*Ik2);

//k4
Sk4 = h*dSdt(N,B,S[i-1]+ 0.5*Sk3,I[i-1]+ 0.5*Ik3);
Ik4 = h*dIdt(y,B,N,I[i-1]+ 0.5*Ik3,S[i-1]+ 0.5*Sk3);
Rk4 = h*dRdt(y,I[i-1]+ 0.5*Ik3);

// Update next value of funtions
S[i] = S[i-1] + (1.0/6.0)*(Sk1 + 2.*Sk2 + 2.*Sk3 + Sk4);
I[i] = I[i-1] + (1.0/6.0)*(Ik1 + 2.*Ik2 + 2.*Ik3 + Ik4);
R[i] = R[i-1] + (1.0/6.0)*(Rk1 + 2.*Rk2 + 2.*Rk3 + Rk4);

// Update next value of t
t[i] = t[i-1] + h;
}

//~~~~~~~~~~~~~~~~~~~
//PLOT GRAPHS
//~~~~~~~~~~~~~~~~~~~

// Open a plot window
if (!cpgopen("/XWINDOW")) return 1;
//set up plot axes
cpgenv(0.,1000.,0.,100.,0,1);
// Label axes
cpglab("Time (days)", "Fraction of people", "SIR Model");

// Change plot colour to colour 4 (BLUE)
cpgsci(4);
// Plot S
cpgline(n+1,t,S);

//change colour of derivative
cpgsci(7);
// Plot I
cpgline(n+1,t,I);

//change colour of derivative
cpgsci(5);
// Plot R
cpgline(n+1,t,R);

cpgclos();

return 0;
}```

2. You just need to answer this simple question:
What do you think is the size of array "t"?

By the way, you should learn how to use more descriptive names for your variables.

3. Thanks for your answer! Sorry about any confusion with the variables, will defienitely keep that in mind for next time! So t should be of some size to do with n right? I was thinking [n+1] but it didn't seem to help (I also tried changing the array sizes of S,I and R to the same but I am still a little bit stuck...)

4. Having fixed your array sizes, the most likely cause of floating point exception is going to be division by zero.

Your arrays quickly mushroom into infinities and nans.
Code:
```\$ gcc -Wall -Wextra -g foo.c
foo.c: In function ‘main’:
foo.c:48:9: warning: unused variable ‘u’ [-Wunused-variable]
float u=0.02;
^
\$ gdb -q ./a.out
(gdb) b 91
Breakpoint 1 at 0x400ffd: file foo.c, line 91.
(gdb) run
Starting program: /home/sc/Documents/a.out

Breakpoint 1, main () at foo.c:91
91	  return 0;
(gdb) p t
\$1 = {0, 0.150000006, 0.300000012, 0.450000018, 0.600000024, 0.75, 0.899999976, 1.04999995, 1.19999993, 1.3499999, 1.49999988, 1.64999986, 1.79999983, 1.94999981, 2.0999999, 2.25, 2.4000001, 2.55000019,
2.70000029, 2.85000038, 3.00000048, 3.15000057, 3.30000067, 3.45000076, 3.60000086, 3.75000095, 3.90000105, 4.05000114, 4.20000124, 4.35000134, 4.50000143, 4.65000153, 4.80000162, 4.95000172, 5.10000181,
5.25000191, 5.400002, 5.5500021, 5.70000219, 5.85000229, 6.00000238, 6.15000248, 6.30000257, 6.45000267, 6.60000277, 6.75000286, 6.90000296, 7.05000305, 7.20000315, 7.35000324, 7.50000334, 7.65000343,
7.80000353, 7.95000362, 8.10000324, 8.25000286, 8.40000248, 8.5500021, 8.70000172, 8.85000134, 9.00000095, 9.15000057, 9.30000019, 9.44999981, 9.59999943, 9.74999905, 9.89999866, 10.0499983, 10.1999979,
10.3499975, 10.4999971, 10.6499968, 10.7999964, 10.949996, 11.0999956, 11.2499952, 11.3999949, 11.5499945, 11.6999941, 11.8499937, 11.9999933, 12.1499929, 12.2999926, 12.4499922, 12.5999918, 12.7499914,
12.899991, 13.0499907, 13.1999903, 13.3499899, 13.4999895, 13.6499891, 13.7999887, 13.9499884, 14.099988, 14.2499876, 14.3999872, 14.5499868, 14.6999865, 14.8499861, 14.9999857}
(gdb) p S
\$2 = {30, 8.63095767e+10, inf, nan(0x400000) <repeats 98 times>}
(gdb) p I
\$3 = {30, -863043072, -nan(0x400000) <repeats 99 times>}
(gdb) p R
\$4 = {40, -52668.1797, -inf, -nan(0x400000) <repeats 98 times>}
(gdb)```

5. I thought that might be happening! Thanks so much! I did some research and got some better initial conditions and the program runs!

6. please fix the size of array always.