Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    stampa numeri rappresentazione in virgola mobile

    Perche in Java il primo codice stampa i float esatti mentre il secondo stampa da 1.4 in poi con
    un piccolo errore ?

    codice:
    float x = 1.4f
    System.out.println(x) // stampa 1.4
    x += 0.2f;
    System.out.println(x); // stampa 1.6
    codice:
    float x = 0.0f;
    
    for(int i=0;i<10;i++){
      x += 0.2f;            
      System.out.println(x); 
    }
    
    /* stampa 
    0.2
    0.4
    0.6
    0.8
    1.0
    1.2
    1.4000001
    1.6000001
    1.8000002
    2.0000002
    */

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Mr.Bloom Visualizza il messaggio
    Perche in Java il primo codice stampa i float esatti mentre il secondo stampa da 1.4 in poi con
    un piccolo errore ?
    È questione dei (noti) problemi della rappresentazione dei numeri floating-point. Non tutti i numeri possono essere rappresentati in maniera precisa. Ti potrebbe sembrare strano ma ad esempio 0.875, 1.5, 2.75 possono essere rappresentati in modo esatto mentre ad esempio 1.1 o 1.7 no. E se non sono esatti, sono "quasi" esatti, cioè molto vicini con un piccolissimo errore.
    Facendo somme come nel tuo esempio vengono anche sommati degli errori. E comunque anche quando si stampa un numero, per ottenere le cifre vengono fatti molti calcoli e pure questi possono portare ad errori.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    È questione dei (noti) problemi della rappresentazione dei numeri floating-point. Non tutti i numeri possono essere rappresentati in maniera precisa. Ti potrebbe sembrare strano ma ad esempio 0.875, 1.5, 2.75 possono essere rappresentati in modo esatto mentre ad esempio 1.1 o 1.7 no. E se non sono esatti, sono "quasi" esatti, cioè molto vicini con un piccolissimo errore.
    Facendo somme come nel tuo esempio vengono anche sommati degli errori. E comunque anche quando si stampa un numero, per ottenere le cifre vengono fatti molti calcoli e pure questi possono portare ad errori.
    Ciao, grazie per la tua risposta.

    Conosco i problemi della rappresentazione dei float ed infatti mi aspettavo che la stampa sarebbe stata inesatta anche nel primo codice, con numeri che non possono essere rappresentati in maniera precisa.

    Prendiamo ad esempio 1.1, il seguente codice stampa esattamente 1.1, mentre mi aspetterei qualcosa del tipo 1.100000001 o simili

    codice:
    float x = 1.1f;
    System.out.println(x);

    forse e' una domanda sciocca, ma come fa System.println() a sapere che quel valore e' proprio 1.1 se non puo' essere rappresentato in memoria ?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.