L'Angolo delle Chiacchiere Senza Contesto

Mi fido! :slight_smile:

Stamattina provo la formula di settimana scorsa.

Tenete conto che è il mio primo approccio col C e Basic non lo uso più da una vita.

1 Mi Piace

Al momento la formula per qualunque valore di “x” restituisce sempre un valore pari a “a”

Trovato. Ho dichiarato le variabili “float” e funziona. Con double non andava.
Ho dovuto moltiplicare il tutto per 1000

Risolto anche il * 1000 era il setting della finestra di visualizzazione.

1 Mi Piace

Comunque attenti che una variabile float ha una rappresentazione completamente diversa e quindi in teoria il giochino non funziona.
Adesso non conosco il tuo ambiente e non so dire cosa fosse, ma fai attenzione a cosa si passa come parametro di ingresso e cosa ti attendi come uscita.

Come scritto a pagina 373, le variabili dichiarate hanno un loro tipo che deve coincidere con quello che usi nella “macro”.
Mentre per gli interi una discrepanza può darti una “moltiplicazione” o “divisione” dei valori, per i floating point, data la diversa rappresentazione in mantissa ed esponente, i valori che otterrai saranno completamente imprevedibili.

Con variabili double (b-a)/(d-c) (20-40)/(50-13) mi da risultato 0 anziché -0,54.

Ho simulato la curva cambiando X a “mano” e la curva è risultata corretta.
La curva la calcola anche il driver a cui è collegato lo HMI, ma non mi mette a disposizione il dato.
Per visualizzarlo ho voluto riprodurre la curva col Vs impagabile aiuto. :slight_smile:

Però forse quando ho dichiarato le double le ho dichiarate “unsigned int” anziché “signed int” . Potrebbe essere per questo?

Non ho capito, dove le hai dichiarate int? E dove double?
Se le variabili in entrata sono dichiarate intere, e quella di uscita Double, allora si il risultato è 0 perché la formula è calcolata tra interi, cioè da zero, e solo alla fine viene convertita in double, sempre zero.
Signed o unsigned non dovrebbe dare differenze apprezzabili se sono positive.

Ah, avevo capito che usavi variabili double per il controllo dei bit, scusa.

Allora, int è intero, con segno o meno. 0,54 è un decimale, quindi se fai una operazione il cui risultato è frazionario (quindi rappresenta da un numero decimale), per assegnarla ad una variabile intera viene fatta una conversione implicita e arrotondata. Si passa da 0,54 a 0.

Le variabile float, ossia la rappresentazione in virgola mobile di cifre decimali, sono il modo per leggere con precisione (quale precisione? Dipende è word, double word o altro) numeri decimali.

Un intero non potrà mai rappresentare un decimale. Forse anche il compilatore di ha lanciato un avvertimento per la perdita di precisione dovuta alla conversione (cast) implicito nell’assegnazione di un risultato decimale - se i tipi usati sono diversi nei vari passaggi.

Occhio che se le variabili che usi per numeratori e denominatori di divisioni sono interi, il risultato sarà un intero, e quindi niente avviso al momento di compilare.
Di certo avrai perdite di precisione ogni operazione. Quindi operazioni successive saranno sempre meno precise.
Esempio
(10 / 3 ) / 2, se fosse rappresentato solo da interi darebbe prima 10/2=3 (perché si arrotonda 3,3 periodico) e poi 3/2=1 (arrotondamento di 1,5).

Gli interi per definizione non sono frazionari.

1 Mi Piace

:man_facepalming:

Ok, però il tipo della variabili, eviterei di cambiarlo in modo artistico :sweat_smile:
Se vuoi cambiare il tipo al massimo fai un cast esplicito nel codice, anche solo per renderlo comprensibile/evidente … soprattutto se ti capiterà di andarlo a riprendere in futuro.

1 Mi Piace

Tieni conto che non posso dichiarare le variabili come si fa in C, ma devo compilare una form, per cui sono legato alle opzioni che mi propone.

Se float non è tra i tipi permessi, allora prima di fare l’operazione devi convertire ciascuna di esse in float. Poi converti da float a intero con opportuno arrotondamento.
Alternativamente, puoi fare l’operazione in virgola fissa, in pratica premoltiplichi per un fattore fisso, esempio 100, poi tenendo conto della posizione della virgola a ciascuna operazione, rinormalizzi.
La cosa più semplice è usare la virgola mobile, se possibile.

Float è tra le opzioni.

A quanto pare se nelle nostre città si aprono voragini nel terreno altrove sono più uniformi sprofondano le città intere :face_with_diagonal_mouth:

Google mi aveva passato un articolo sulle città cinesi

ma guardando in giro pare la cosa sia generale

Con l’Indonesia che nei prossimi 20 anni sposterà la capitale.

1 Mi Piace

Sì, avevo letto. Non ricordo se anche Manhattan ha lo stesso problema… Ma comunque con l’innalzamento del livello del mare i risultati saranno simili.

Intanto il nostro vecchio forum sembra abbia problemi da almeno una settimana:

Giusto per non dimenticare di essere grati per questo posto.

4 Mi Piace

Si, ma Antha?

È un po’ che non scrive, mi pare.

Poveraccio.
Aprirà un forum con Jirella :rofl: