Author Topic: 9 - 8,9 = 0,09999... Perché?  (Read 9165 times)

0 Members and 5 Guests are viewing this topic.

Offline marchionili

  • Novizio del forum
  • *
  • Posts: 38
  • Karma: 0
  • Novizio
9 - 8,9 = 0,09999... Perché?
« on: 20 November , 2011, 18:00:38 PM »
Perché su Visual C# 9 - 8,9 = 0,09999... ? Qui sotto trovate il codice incriminato:

Code: [Select]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        double SOMMA(double A, double B)
        {
            double C = A + B;
            return C;
        }
        private void calcola_Click(object sender, EventArgs e)
        {
            double Variabile_A = double.Parse(A.Text);
            double Variabile_B = double.Parse(B.Text);
            double Variabile_C;
            if (n.Text == "+")
                Variabile_C = SOMMA(Variabile_A, Variabile_B);
            //else Variabile_C = Variabile_A - Variabile_B;
            else Variabile_C = SOTTRAZIONE(Variabile_A, Variabile_B);
            C.Text = Convert.ToString(Variabile_C);
        }

        private double SOTTRAZIONE(double a, double b)
        {
           
            double c = a - b;
            return c;
        }



        private void S1_CheckedChanged(object sender, EventArgs e)
        {
            if (S1.Checked)
                n.Text = "+";
            else
                n.Text = "-";

        }

        private void S2_CheckedChanged(object sender, EventArgs e)
        {
            if (S1.Checked)
                n.Text = "+";
            else
                n.Text = "-";
        }

        private void n_TextChanged(object sender, EventArgs e)
        {

        }

        private void C_TextChanged(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

Inoltre non ho capito perché se scrivo "Double" visual studio mi colora la parola di verde mentre se scrivo "double" tutto minuscolo mi colora la parola di blu. Un'altra cosa che mi é poco chiare é la differenza tra:

Code: [Select]
        private double SOTTRAZIONE(double a, double b)
        {
           
            double c = a - b;
            return c;
        }

e:

Code: [Select]
        double SOTTRAZIONE(double a, double b)
        {
           
            double c = a - b;
            return c;
        }

ciao e grazie

Offline Gilean

  • Administrator
  • Bisnonno Veterano
  • *****
  • Posts: 3292
  • Karma: 202
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #1 on: 20 November , 2011, 21:57:00 PM »
allora andiamo per ordine:

1.double denota un tipo semplice che archivia valori a virgola mobile a 64 bit. se vuoi avere una approssimazione corretta, ti consiglio di usare variabili di tipo float (32bit). un double e' uno spreco di risorse.

2.la sottolineatura verde rappresenta non un errore di codice, ma di forma. Nel caso in questione scrivendo Double, corri il rischio di scriverlo sbagliato in quanto c# e' un linguaggio CASE SENSITIVE (ovvero per lui la variabile int a e la variabile int A sono due variabili diverse).

3.la parola chiave private e' una parola che rende il metodo privato ovvero utilizzabile solo all'interno della classe che contiene il metodo. Potresti volere , ad esempio, utilizzare quel metodo solo all'interno di una determinata classe e non volerlo estendere all'esterno, per tue ragioni di codice (per non incasinarlo). la private svolge proprio questo lavoro. Viceversa, se vuoi che il metodo possa essere utilizzato anche all'esterno, in altre classi (per esempio quando programmi una libreria di metodi), la devi dichiarare public.
Il calcolo è come la pelle delle @@, lo tiri dove vuoi tu.
Esempio di programmazione a Loop:
L'enunciato che segue è falso
L'enunciato precedente è vero.

Nonostante la consapevolezza dei rischi che si corrono dopo aver visto le prestazioni da 3° dan

Massimo.T

  • Guest
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #2 on: 21 November , 2011, 08:29:31 AM »
essendo 0.1 e 0.0(9) (il 9 è periodico) lo stesso numero, non vedo problemi.

Offline marchionili

  • Novizio del forum
  • *
  • Posts: 38
  • Karma: 0
  • Novizio
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #3 on: 21 November , 2011, 23:05:54 PM »
allora andiamo per ordine:

1.double denota un tipo semplice che archivia valori a virgola mobile a 64 bit. se vuoi avere una approssimazione corretta, ti consiglio di usare variabili di tipo float (32bit). un double e' uno spreco di risorse.

2.la sottolineatura verde rappresenta non un errore di codice, ma di forma. Nel caso in questione scrivendo Double, corri il rischio di scriverlo sbagliato in quanto c# e' un linguaggio CASE SENSITIVE (ovvero per lui la variabile int a e la variabile int A sono due variabili diverse).

3.la parola chiave private e' una parola che rende il metodo privato ovvero utilizzabile solo all'interno della classe che contiene il metodo. Potresti volere , ad esempio, utilizzare quel metodo solo all'interno di una determinata classe e non volerlo estendere all'esterno, per tue ragioni di codice (per non incasinarlo). la private svolge proprio questo lavoro. Viceversa, se vuoi che il metodo possa essere utilizzato anche all'esterno, in altre classi (per esempio quando programmi una libreria di metodi), la devi dichiarare public.

1.anche scrivendo float non risolvo il problema.

2.si questo lo sapevo però sia che scriva "double" sia che scriva "Double" il programma funziona alla perfezione e non sapevo quale fosse corretto e quali fossero le differenze. visual c# non mi sottolinea nè una parola nè un'altra, semplicemente le colora in modo doverso.

3.ok capisco, grazie mille

Offline marchionili

  • Novizio del forum
  • *
  • Posts: 38
  • Karma: 0
  • Novizio
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #4 on: 21 November , 2011, 23:09:49 PM »
essendo 0.1 e 0.0(9) (il 9 è periodico) lo stesso numero, non vedo problemi.

Il problema é che uso variabili a 64 bit ed ottengo errori superiori rispetto ad una semplice calcolatrice tascabile...  :down: se permetti non é un granché...  :(

Offline Alex_Drake

  • Semi Esperto
  • **
  • Posts: 50
  • Karma: 20
  • Ingegnere
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #5 on: 22 November , 2011, 14:26:20 PM »
2.si questo lo sapevo però sia che scriva "double" sia che scriva "Double" il programma funziona alla perfezione e non sapevo quale fosse corretto e quali fossero le differenze. visual c# non mi sottolinea nè una parola nè un'altra, semplicemente le colora in modo doverso.

"Double" è una classe (e quindi ha a disposizione dei metodi)
"double" denota un tipo

Alessandro
ing. Alessandro Dragone

Offline Gilean

  • Administrator
  • Bisnonno Veterano
  • *****
  • Posts: 3292
  • Karma: 202
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #6 on: 22 November , 2011, 14:46:25 PM »
"Double" è una classe (e quindi ha a disposizione dei metodi)
"double" denota un tipo

Alessandro

Esatto, grazie alex
Il calcolo è come la pelle delle @@, lo tiri dove vuoi tu.
Esempio di programmazione a Loop:
L'enunciato che segue è falso
L'enunciato precedente è vero.

Nonostante la consapevolezza dei rischi che si corrono dopo aver visto le prestazioni da 3° dan

zax2010

  • Guest
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #7 on: 25 November , 2011, 23:10:36 PM »
Era il 1985. Più o meno.

I primi due anni di università ero riuscito a farli con una calcolatrice uscita nel Dash. Le quattro operazioni e basta. Quando la placchetta metallica che circondava i tasti si era un po' rovinata l'avevo smontata e carteggiata con la carta vetrata fine, ottenendo uno splendido effetto “alluminio spazzolato”.
Solamente con gli esercizi di chimica, per il calcolo del PH, mi ero trovato in difficoltà. Ma avevo risolto riesumando le tavole logaritmiche di mio padre vecchie di almeno 30 anni prima. Forse sono stato uno degli ultimi ad utilizzarne. Con 8 cifre decimali, e metodo interpolante per ricavare la 9 cifra.
Ma alla fine, all'ingresso nel terzo anno, mi ero deciso. Forse avevo rotto il porcellino, non ricordo. Bisognava comperare una calcolatrice scientifica. Assolutamente serviva.

A quei tempi era già un po' scemata l'invasione delle calcolatrici HP con la loro logica polacca inversa, ma comunque dai prezzi per me inavvicinabili. Inoltre i loro tasti duri e puntuti mi piacevano assai poco.
I miei colleghi più sciccosi dicevano meraviglie della Texas Instruments, in specie di un modello appena uscito, dai tasti grandi e colorati con le papille gustative in rilievo, forse un po' meno potente di altri modelli precedenti ma sicuramente più user-friendly.

Io invece, e non ricordo perchè la scelsi, portai a casa una normalissima Casio. Alta quanto bastava per infilarci una pila stilo AA, munita anche di funzioni statistiche, poteva memorizzare formule fino a 6 variabili, e, cosa in fondo mai utilizzata, dotata di una procedura numerica di calcolo degli integrali (non ricordo come, si inseriva una funzione, un intervallo di integrazione, e dopo qualche secondo di attesa ti sputava fuori un numero).

Fu con mia grande sorpresa che un giorno chiedendo alla mia calcolatrice la seguente operazione: 4.3^3 mi trovai il display inondato di cifre.
Provai con 4.2^3, 5.3^3, 7.3^3, ecc. e tutto andava alla perfezione. Sempre tre cifre decimali nel risultato. Insomma, con l'operazione incriminata, invece di 79.507 (numero che ormai conosco a memoria) il display riportava 79.5069999999.

Fu così quindi che mi decisi di scrivere al produttore. La prima ed unica volta. Ovviamente non alla Casio in Giappone. Scrissi al distributore della Casio per l'Italia con sede a Milano.
Avevo smontato la calcolatrice, annotato il modello di processore (un Toshiba), il modello di calcolatrice, ecc. e chiedevo il motivo di un simile comportamento del mio strumento di calcolo, e perchè mai proprio per 4.3^3.

Attesi mesi e mesi la loro risposta che, vi dico subito, non arrivò mai.

Chissà le risate che deve essersi fatto chi ha letto la mia lettera prima di cestinarla.
Fatto sta che girando sempre attorno a quel mistero, ad un certo punto rileggendo il manualetto di istruzioni, tra le specifiche tecniche, trovai una parziale risposta alle mie domande.
Tra queste era prevista una tolleranza nella esattezza dei risultati forniti dalla calcolatrice. Tolleranza in cui il mio 79.5069999999, evidentemente calcolato come sviluppo in serie troncato, rientrava perfettamente.

Tornando al problema. Che tu possa aver riscontrato il problema con un tipo float (generalmente a 32 bit) lo reputo quasi normale. Certo, con il tipo double da te utilizzato, a 64 bit, la cosa è strana. A questo punto ti rimarrebbe una ultima carta, ovvero utilizzare il tipo long double che dovrebbe essere un numero ad 80 bit, e che dovrebbe eliminarti il problema riscontrato.

Offline Betoniera

  • Esperto del forum
  • ***
  • Posts: 217
  • Karma: 74
  • Neo - Laureato
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #8 on: 26 November , 2011, 19:55:11 PM »
Era il 1985. Più o meno.
...
I miei colleghi più sciccosi dicevano meraviglie della Texas Instruments
...


ciao zax2010
C'ero anch'io a quei tempi, e forse anche qualche anno prima.
Molti ingegneri, allora, calcolavano ancora col regolo calcolatore.
Però sciccosi erano quelli che avevano le HP che costavano 4 volte le Texas (avevano i contatti placcati in oro per non ossidarsi).
Io avevo la Texas Ti 59 (macchinetta eccezionale per quei tempi) programmabile in assembler con possibilità di memorizzare i programmi su schedine maghetiche.
Ho ancora i quaderni coi listati dei programmi.
Poteva, in teoria risolvere anche i telai piani col metodo di Takabea (ho trovato cosa fosse sul Belluzzi).
Una volta ho provato a rislverne uno. C'è voluta una notte intera per il calcolo.
Comunque, sembra incredibile ma, con quella macchinetta, io calcolavo i capannoni e verificavo le travi precompresse.
Ciao

« Last Edit: 26 November , 2011, 19:58:04 PM by Betoniera »

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #9 on: 28 November , 2011, 11:04:56 AM »
Era il 1985. Più o meno.
...
I miei colleghi più sciccosi dicevano meraviglie della Texas Instruments
...


ciao zax2010
C'ero anch'io a quei tempi, e forse anche qualche anno prima.
Molti ingegneri, allora, calcolavano ancora col regolo calcolatore.
Però sciccosi erano quelli che avevano le HP che costavano 4 volte le Texas (avevano i contatti placcati in oro per non ossidarsi).
Io avevo la Texas Ti 59 (macchinetta eccezionale per quei tempi) programmabile in assembler con possibilità di memorizzare i programmi su schedine maghetiche.
Ho ancora i quaderni coi listati dei programmi.
Poteva, in teoria risolvere anche i telai piani col metodo di Takabea (ho trovato cosa fosse sul Belluzzi).
Una volta ho provato a rislverne uno. C'è voluta una notte intera per il calcolo.
Comunque, sembra incredibile ma, con quella macchinetta, io calcolavo i capannoni e verificavo le travi precompresse.
Ciao



Io c'ero anche un pò prima, quando i problemi di topografia dovevano risolversi con formule monomie per poter utilizzare le soluzioni coi logaritmi e le relative tavole. Io avevo quella a sette decimali, comprate di seconda, e forse anche terza, mano in un negozietto a Palermo.
Adesso non so dove sono andate a finire, ma le sto cercando per mostrare al mio piccolo la preistoria del calcolo numerico.
Poi acquistai una calcolatrice, anche io una Casio. Non faceva gran figura rispetto alle piu costose texas ma riusciva a fare il suo lavoro egregiamente. Con quella calcolai gli sviluppi in serie doppia per l'esercitazione sulle piastre di tecnica delle costruzioni.

P.S.: Subito dopo la laurea, col compenso del primo lavoro, comprai una HP 32S RPN Scientific. Uso ancora questa.
« Last Edit: 28 November , 2011, 11:08:05 AM by afazio »
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline melo

  • Semi Esperto
  • **
  • Posts: 146
  • Karma: 11
  • Novizio
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #10 on: 28 November , 2011, 19:43:02 PM »
Al posto di 9, prova a passare al programma 9.0
"Non prendere la vita troppo sul serio, tanto non ne uscirai vivo!" 

zax2010

  • Guest
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #11 on: 28 November , 2011, 23:39:39 PM »
Al posto di 9, prova a passare al programma 9.0

Provare non costa nulla.
Però se C# segue la stessa 'filosofia' del C, esso eseguirà automaticamente la forzatura del cast. Non stiamo parlando infatti di Pascal.

Prima di sottrarre 0.1 a 9, se quest'ultimo numero fosse un intero (cosa che nel codice postato da Marchiolini comunque non è), il compilatore provvede automaticamente a trasformarlo in un float, in modo da sottrargli un altro float ed ottenere quindi un risultato float.
Ovviamente si possono fare tutti i 'casini' che si vogliono.

Ad esempio se c è un int, l'espressione: c=9-0.1 fornisce 8!

Offline pasquale

  • Nonno del forum
  • *****
  • Posts: 951
  • Karma: 193
  • Ingegnere
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #12 on: 26 August , 2012, 15:14:56 PM »
se ricordo bene (dovrei mettermi a risfogliarlo ma ora non mi va ...) un problema del genere lo spiega anche Ghersi nel suo libro ora a gratis
http://www.dica.unict.it/users/aghersi/Testi/Libri/IntroPro/IntroPro.pdf

mi associo anche io ai ricordi da libro "Cuore"  :rotfl:
ho usato tanto il "Manuale logaritmico completo del Tecnico" di Clemente Bonfigli, Hoepli,
all'università comprai una Texas Instruments TI-30 Galaxy a cui ho cambiato le pile una sola volta in oltre 20 anni, ma da un paio di anni il visore si era esaurito e ho dovuto metterla tra i ricordi;
però sempre durante l'università un anno presi la borsa di studio e mi comprai una Sharp Pocket computer PC-1401 (se ricordo bene 250'000 lire), programmabile anche in Basic, che ancora uso
« Last Edit: 26 August , 2012, 20:12:40 PM by pasquale »
impossibile est ut is faciat, qui nescit quomodo fiat
(Arnold Geulincx)

Offline pasquale

  • Nonno del forum
  • *****
  • Posts: 951
  • Karma: 193
  • Ingegnere
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #13 on: 26 August , 2012, 20:30:08 PM »
dimenticavo,
complimenti davvero a zax perché sa scrivere molto bene ed è piacevole leggerlo,
potrebbe fare anche lo scrittore con successo

impossibile est ut is faciat, qui nescit quomodo fiat
(Arnold Geulincx)

Offline Cris

  • Global Moderator
  • Nonno del forum
  • *****
  • Posts: 1514
  • Karma: 218
  • Libero Professionista
Re: 9 - 8,9 = 0,09999... Perché?
« Reply #14 on: 27 August , 2012, 00:01:13 AM »
dimenticavo,
complimenti davvero a zax perché sa scrivere molto bene ed è piacevole leggerlo,
potrebbe fare anche lo scrittore con successo

Si.. ma... dov'è.. ?  :oook:

Pasquale... aiutaci a ritrovarlo...  :)
Quando i nani fanno l'ombra lunga.... è l'ora del tramonto.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24