2015-08-03 12 views
6

stumped dal significato di "grandezza globale" nella specifica del linguaggio Java:Significato di "grandezza globale" di un certo numero

Ampliamento conversioni primitive non perdere le informazioni circa l'entità complessiva di un numerica valore.

È "ordine di grandezza" o "valore assoluto"? O qualcos'altro?

+1

Il modo in cui lo vedo, in pratica significa "il valore concettuale astratto" in opposizione alla sequenza effettiva di bit utilizzata per rappresentare il valore. A proposito, la conversione 'float-> double' fa ** not ** preserva la grandezza generale. – biziclop

+0

@biziclop - non se è 'strictfp' - quindi non dovrebbe perdere alcuna informazione:" * da float a double in un'espressione 'strictfp' (§15.4), non perde alcuna informazione, il valore numerico è perfettamente conservato. * " –

+0

@AndyBrown Sì. È solo il modo in cui questo è espresso nel JLS è un po 'strano: prima affermano che non succede, poi cinque paragrafi dopo aggiungono un avvertimento che erm ... in realtà, senza 'strictfp' succede. – biziclop

risposta

3

Dall'articolo Wikipedia, Magnitude (mathematics):

In matematica, grandezza è la dimensione di un oggetto matematico, una proprietà che l'oggetto può essere paragonato come più grande o più piccolo di altri oggetti dello stesso tipo.

In inglese normale, la grandezza di 32767 è 32767. La grandezza è equivalente al valore del numero.

Nella specifica JLS, penso che stiano usando la magnitudine per indicare il numero di cifre nel numero. 32767 è il numero intero più grande di quello che può essere contenuto in un campo a 16 bit con segno. Se si sposta 32767 in un campo di bit con meno di 15 bit, il numero non sarà più 32767. Questo si chiama restringimento. Se si sposta 32767 in un campo di bit con più di 15 bit (o 16 bit, firmato), verrà mantenuto il valore di 32767. Questo si chiama allargamento.

Un ordine di grandezza è l'addizione o la sottrazione di una cifra dal numero. Ad esempio, utilizzando numeri interi 10 di base, 32767 è un ordine di grandezza superiore a 3276. 3276 è un ordine di grandezza superiore a 327.

+0

Questo sembra contraddire il modo in cui viene usata la "magnitudine" la domanda: con la definizione matematica, una conversione allargata da float a long potrebbe cambiare la magnitudine, perché le cifre dopo la virgola decimale potrebbero andare perse durante la conversione –

+0

Sfortunatamente la grandezza di cui parlano nel JLS non corrisponde esattamente a questa definizione. E 'vicino ma non proprio .. – biziclop

+0

@ Julian In realtà ho capito il contrario: long-> float è una conversione allargata che può perdere precisione. – biziclop

1

Ok, ecco un altro tentativo di definizione formale.

Se f(x) è una conversione di ampliamento, per ogni x <= y, f(x) <= f(y). In altre parole, l'ampliamento delle conversioni conserva un ordinamento parziale dei valori.

Questo è quello che non significa perdere informazioni sulla magnitudine complessiva.

La perdita di precisione in questo framework indica che per alcuni x < y, f(x) = f(y).


L'unico problema con questa definizione è il (float)Double.MAX_VALUE trabocco risultante Float.POSITIVE_INFINITY, che risponde tecnicamente i criteri di cui sopra, ma non in realtà dovrebbe contare come non perdere le informazioni circa l'entità complessiva.

+0

L'ultimo bit dovrebbe essere 'f (x)

+0

@ Julian No, perché la perdita di precisione indica che alcuni valori vicini verranno convertiti allo stesso valore. – biziclop

Problemi correlati