Come dire: la vita l'universo e tutto quanto
o per meglio dire: se Pi greco fosse differente da 3.14 non saremmo in un universo euclideo
io, per me, oggi c'era il sole e mi son gardato tante di quelle curve che se PI greco anche valesse 6 mi starebbe bene lo stesso, ma per rispondere a questo qui: Pi greco - Software - Arduino Forum
come vedete avevo promesso che ci pensavo, orca l'oca se ci ho pensato alle cose tonde....
vabbe, siccome abbiamo a che fare con una geometria bi-dimensionale (per il momento) ho pensato di crearmi un tipodati complesso, nel senso matematico del termine: parte reale e parte immaginaria
OT oqquanto ho immaginato oggi ......... fine OT
quindi mi sono scritto questo:
// di Nelson "StandardOil"
// Idea da sviluppare:
// capire il valore di PI greco per
// dimostrare se lo spazio è piano o curvo
// definisco il tipo dati Coordinata
typedef struct
{
float X;
float Y;
} Coordinata;
// dichiaro le variabili
Coordinata punto; // punto attuale in trattamento
unsigned int long contatore; // totale dei punti contati
unsigned int long interni; // totale dei punti interni al cerchio
che come vedete definisce un tipo dati complesso
e poi devo poter generare un punto random
userò una funzione che mi restituisce quanto necessario
Coordinata genera(void)
{
// una funzione che genera un punto (insieme di coordinate) casuale
static int seme = 0;
if (!seme)
{
seme = analogRead(A0);
randomSeed(seme);
// genero il seme solo la prima volta
}
Coordinata generato;
generato.X = 0;
generato.Y = 0;
// per 6 cifre significative (oltre non serve)
for (byte i = 0; i < 6; i++)
{
generato.X = generato.X / 10 + random(10);
// ogni singola cifra delle sei significative è casuale tra 0 e 9 (10 non viene generato)
generato.Y = generato.Y / 10 + random(10);
}
generato.X = generato.X / 10;
generato.Y = generato.Y / 10;
return generato;
}
che come vedete genera le due coordinate a 6 cifre significative, genera direttamente le cifre, per "nascondere" meglio il fatto che la generazione dei numeri casuale NON arriva fino al parametro passato: random(10) NON restituirà mai 10, ma al massimo 9
questa cosa, se non tenuta in considerazione altererebbe la casualità della generazione, inoltre inizializzo il generatore di numeri casuali una volta sola, e restituisco la variabile del tipo complesso che mi serve
anche per sapere se un punto è oppure no nel quarto di cerchio ho usato una funzione, che accetta una variabile complessa e restituisce un bool
bool compreso(Coordinata punto)
{
{
// ritorna true se il punto passato è interno al quarto di cerchio centrato in 0,0 e raggio 1
return ((punto.X * punto.X + punto.Y * punto.Y) <= 1);
// lo so forse non servivano tutte queste parentesi
}
}
banale, vero? ma pur se banali le cose vanno fatte.........
a questo punto la loop
void loop(void)
{
do
{
;
Serial.print("Dopo: ");
Serial.print(++contatore);
Serial.print(" tentativi il valore calcolato è:");
Serial.println(4.0 / contatore * (interni = interni + compreso(genera())), 5);
}
while (contatore > 0);
}
che è praticamente tutta stampe,
ahhhh il bello del C........: la concisione
la funzione genera() genera un punto, passato alla compreso(), che restituice 0 o 1, che viene sommato al totalizzatore, durante il calcolo propedeutico alla stampa
manca naturalmente la setup, ma è banale banale, quasi una noia
void setup(void)
{
Serial.begin(9600);
Serial.println("Programma per la ricerca sperimentale del valore di PI greco");
Serial.println("Se il valore al termine delle iterazioni fosse diverso da 3.141592654");
Serial.println("Potremmo sospettare di vivere in un universo Non-Euclideo");
}
ora ho un problma grave: nel tempo che ci ho messo a scrivere questo post il mio arduino mi ha calcolato PI: vale 3.15092, quindi la curvatura dell'universo è in trasfomazione
devo correre a sorvegliare quelle curve di prima, scusate se mi assento