2013-03-05 15 views
10

Come si rileva da OracleJava Perché la conversione da lungo (64) a float (32) è considerata ampliata?

riferimento dalOracle Docs

Allargamento conversione Primitive 19 conversioni specifiche su tipi primitivi sono chiamati ampliamento conversioni primitive:

  1. byte short, int , long, float, double
  2. short to int, long, float, double
  3. char a int, long, float o doppio
  4. int long, float o doppio
  5. lungo per galleggiare o doppia?
  6. galleggiante raddoppiare

Se un oggetto ha 32 bit ed una lunga ha 64 Come è considerato allargando? Non dovrebbe essere considerato un restringimento?

+0

penso che sia correlato con precisione. Posso solo pensare a questo :) – kaysush

+0

Hai detto "* Se un lungo ha 32 bit e un lungo ha 64 *" ... rendi la tua mente su – Bohemian

+0

Non ho capito la tua domanda: se un lungo ha 32 bit e un lungo ha 64 come è considerato allargamento? Non dovrebbe essere considerato un restringimento? Il tipo di dati lungo è un intero di complemento a due di firma a 64 bit in java. si prega di fare riferimento al seguente link: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – Gourabp

risposta

18

L'intervallo di valori che può essere rappresentato da un float o double è molto maggiore dell'intervallo che può essere rappresentato da un long. Sebbene si possa perdere cifre significative durante la conversione da long a float, è ancora un'operazione di "allargamento" perché l'intervallo è più ampio.

Dal Java Language Specification, §5.1.2:

Una conversione allargamento di int o un valore long galleggiante, o di un lungo valore di raddoppiare, può causare la perdita di precisione - cioè, il risultato può perdere dei bit meno significativi del valore. In questo caso, il valore in virgola mobile risultante sarà una versione arrotondata corretta del valore intero, utilizzando la modalità round-to -most IEEE 754 (§4.2.4).

Si noti che uno double può rappresentare esattamente tutti i valori possibili di int.

+2

@ Mrshll187 - In realtà, un 'float' è 32 bit, di cui 8 sono per l'esponente. Ci sono solo 24 bit disponibili per rappresentare la mantissa. Non so cosa significhi "Posso essere fino a 64 bit". Un float può rappresentare alcuni dei numeri compresi tra 1.40129846432481707e-45 e 3.40282346638528860e + 38 (così come alcuni valori speciali come NaN e ± infinito). Un 'long' può rappresentare tutti i numeri nell'intervallo -9,223,372,036,854,775,808 a +9,223,372,036,854,775,807. Puoi pensare al nome di ogni tipo come al nome di un sottoinsieme di numeri. I sottoinsiemi si sovrappongono, ma ogni sottoinsieme ha elementi non nell'altro. –

+0

Grazie Ted! Stavo attraversando un periodo molto difficile per capire ciò che stavo pensando in termini di bit. –

2

È considerato ampliamento poiché float e double possono rappresentare valori superiori a long. Potresti perdere la precisione, ma sarà possibile rappresentare il valore (almeno approssimativamente).

2

Si considera allargamento poiché i numeri che possono essere rappresentati da un float sono più grandi dei numeri che possono essere rappresentati da lunghi. Solo perché float usa la precisione a 32 bit non significa che i numeri che può rappresentare siano limitati a 2^32.

Ad esempio il galleggiante (float)Long.MAX_VALUE+(float)Long.MAX_VALUE è più grande di Long.MAX_VALUE, anche se il galleggiante ha una precisione inferiore a quella lunga.

Problemi correlati