Conversione formula matematica in codice

Salve :slight_smile:
Ho un problemino matematico hehehe avrei fatto scrivere una formuletta da un mio amico per ricavare un dato da i soliti X e y :slight_smile:
La formula è questa: z=max(0; -100*((x-y)|2)/25 + 100) è in formato Excele il simbolo "|2" significa elevato al quadrato.

Ho fatto diverse prove seguendo i manuali ma mi ritrovo sempre un errore da qualche parte :frowning:
Per qualsiasi domanda chiedete :slight_smile:
Grazie mille per l'aiuto :wink:

Se posti la reale formula matematica, non l’obbrobrio di execel, facciamo prima. :slight_smile:

Scusa ma se |2 è il quadrato di quello tra parentesi non ti basta fare:
z=max(0; -100*((x-y)*(x-y))/25 + 100)
???

  1. max(a,b) richiede la virgola .. cosa è quel ';' ? ? ?

  2. per il quadrato di (x - y) non è più semplice scrivere sq(x - y) ?

Guglielmo

Come avevo preannunciato non l'ho scritta io :slight_smile: per me è arabo hehehehe.
Domani devo trovarmi in associazione e ne discutiamo di persona e mi faccio spiegare bene tutti i passaggi.
Comunque di sicuro stasera faccio qualche prova dai suggerimenti di Guglielmo :wink:

Grazie :slight_smile:

Prendendo per buona la formulazione excel, il calcolo risulta essere -100 moltiplicato per il quadrato di (x-y), il tutto diviso per 25 a cui poi si somma 100, inoltre se il valore calcolato è minore di 0, ovvero un numero negativo, il risultato deve essere 0.
Tradotto in C viene fuori questo:

int32_t max
int32_t x
int32_t y

max = (-100 * (x-y)*(x-y))/25 + 100;
if (max < 0 ) max = 0;

Ovviamente prima di eseguire il calcolo x e y dovranno contenere i relativi valori.
Ho dimensionato max, x e y, come interi 32 bit, se i valori di x e y, incluso il quadrato della sottrazione, hanno un range compatibile con gli interi a 16 bit dimensionali come int16_t, così risparmi ram, idem per max, se il suo valore massimo è minore di +/- 32767 dimensionalo come int16_t.

Grazie Mille astrobeed :slight_smile: non so se hai visto ma avevo aperto un altro post per farmi aiutare a realizzare delle fasce anticondensa, diciamo "intelligenti" :smiley: per cercar di risparmiare batteria nelle uscite :wink:
la X è il punto di rugiada e la Y la temperatura ambiente :slight_smile:

Questa sera provo il tuo codice...grazie :slight_smile:

Allora, max è il nome di una funzione e io NON lo userei come nome di variabile ::slight_smile:

Detto questo scriverei, usando le funzioni disponibili ...

int32_t massimo
int32_t x
int32_t y

massimo = max( 0, (-100 * sq(x-y)) / 25 + 100 );

Guglielmo

Grazie mille di sicuro stasera provo anche quella modifica ma con questa funziona in pratica :wink:

Z=(max (0, 10* (sq(X-Y))/25));

ho sostituito il 100* con il 10* altrimenti mi dava un numero in centinaia.

mi restituisce un valore da 0 a più di 100 e dopo la mappatura funziona alla perfezione :smiley:

Grazie Mille :wink: