#define WOKWI // Uncomment if running on Wokwi RP2040 emulator.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// #include "pileco/stdlib.h"
#include "pico/float.h" // Required for using single-precision variables.
#include "pico/double.h" // Required for using double-precision variables.
float wallisSinglePrecisionpi()
{
float product = 1.0;
for (int i = 1; i <= 100000; i++)
{
float j = 2.0 * i;
product *= (j) / (j - 1) * (j) / (j + 1);
}
return product * 2;
}
double wallisDoublePrecisionpi()
{
double product = 1.0;
for (int i = 1; i <= 100000; i++)
{
double j = 2.0 * i;
product *= (j) / (j - 1) * (j) / (j + 1);
}
return product * 2;
}
/**
* @brief LAB #02 - TEMPLATE
* Main entry point for the code.
*
* @return int Returns exit-status zero on completion.
*/
int main()
{
float piSingle = wallisSinglePrecisionpi();
printf("single percision pi = %f\n", piSingle);
float precisionSingle = fabs(3.14159265359 - piSingle);
printf("single precision error = %f\n", precisionSingle);
double piDouble = wallisDoublePrecisionpi();
printf("double precision pi = %f\n", piDouble);
double precisionDouble = fabs(3.14159265359 - piDouble);
printf("double precision error = %f\n", precisionDouble);
// Print a console message to inform user what's going on.
// for (int i = 0; i < 10; i++)
// {
// printf("test %d: ", i);
// printf("%f\n", wallis(i));
// }
// wallis(5);
// Returning zero indicates everything went okay.
return 0;
}