#define WOKWI
//#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "pico/stdlib.h"
#include "pico/float.h" // Required for using single-precision variables.
#include "pico/double.h" // Required for using double-precision variables.
//#define WOKWI // Uncomment if running on Wokwi RP2040 emulator.
#define PI 3.14159265359
#define maxIterations 100000
/**
* @brief EXAMPLE - HELLO_C
* Simple example to initialise the IOs and then
* print a "Hello World!" message to the console.
*
* @return int Application return code (zero for success).
*/
int main() {
#ifndef WOKWI
// Initialise the IO as we will be using the UART
// Only required for hardware and not needed for Wokwi
stdio_init_all();
#endif
// Print a console message to inform user what's going on.
printf("Hello World!\n");
float singlePI = calculatePISingle();
double doublePI = calculatePIDouble();
printf("Float Precision -> %.11f\n", singlePI);
printf("Float precision approximation error -> %.11f\n",
PI - singlePI);
printf("Double Precision -> %.11f\n", doublePI);
printf("Double precision approximation error -> %.11f\n",
PI - doublePI);
printf("Finished\n");
// Returning zero indicates everything went okay.
return 0;
}
float calculatePISingle() {
float result = 1;
float i;
for (i = 1; i < maxIterations; i++) {
float doubleOfN = 4 * i * i;
float multiplicand = (doubleOfN / (doubleOfN - 1));
//* (doubleOfN / (doubleOfN + 1));
result = multiplicand * result;
}
result *= 2;
return result;
}
double calculatePIDouble() {
double result = 1;
double i;
for (i = 1; i < maxIterations; i++) {
double doubleOfN = 2 * i;
double multiplicand = (doubleOfN / (doubleOfN - 1)) *
(doubleOfN / (doubleOfN + 1));
result = multiplicand * result;
}
result *= 2;
return result;
}