Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Giorgio Pastore Newsgroups: it.comp.java Subject: Re: codice instabile Date: Sat, 19 Sep 2020 11:25:41 +0200 Lines: 38 Message-ID: References: <1cf45f7a-aa66-4ae3-bcc1-e60a2e50ee69n@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Trace: individual.net QrI8yP9S+FXC0J4prV8FJQosggYYThjLZCJkBJGlo21g3GK8O0 Cancel-Lock: sha1:Da17wMWYSjWqr8n0EA1Nl1G1l30= User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:68.0) Gecko/20100101 Thunderbird/68.12.0 In-Reply-To: <1cf45f7a-aa66-4ae3-bcc1-e60a2e50ee69n@googlegroups.com> Content-Language: it-IT Xref: csiph.com it.comp.java:9365 Il 09/09/20 02:36, pino mugo ha scritto: > Questa successione numerica definita per ricorrenza deve dare ovviamente sempre lo stesso valore per ogni termine ( cioè sempre 1/77) , invece da tutti valori diversi! .... > double s = 1.0/77.0; ... > for (int i = 1; i <= n; ++i) > { > System.out.print(s + " x "); > > double r = 78.0 * s - 1; > s = r; > > } .... "Deve" è una parola forte. Meglio dire: dovrebbe dare lo stesso valore SE l'aritmetica floating point dei computer fosse la stessa dei razionali della matematica. Ma non è così. Benvenuto nel mondo dei floating point con un numero limitato di bit! 1.0/77.0 non è rappresentabile esattamente con un numero finito di cifre binarie. Ergo, la rappresentazione binaria introduce un'approssimazione a livello delle ultime cifre sgnificative che la tua successione amplifica rapidamente. Per saperne di più: https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html Giorgio PS il tutto è indipendente dal linguaggio!