Porque um float pode receber um long, mas não pode receber um double ?!

4 respostas
G

Pessoal, estou com uma dúvida boba aqui, e por esse motivo não posso passar
para o próximo capítulo do livro da Keity.

Sabemos que um float tem 32 bits, e que um long e um double tem 64.

portando, na minha concepção um float não deveria receber um long, mais ele recebe.
Contrapartida ele não recebe um double.

long long64Bits = 10;
double double64Bits = 10;
float float32Bits = long64Bits; // aqui tudo bem ! porque ?!
float32Bits = double64Bits;// aqui dá pau ! e porque aqui dá pau ?!

Preciso de uma esplicação, não só falar faz um cast que funfa… Isso é importânte, porque com isso também
se define qual método sobrecarregado a JVM chama.

Nesse caso :

Nesse caso float, float é a saída …

4 Respostas

G

Blz galera, o negocio é o seguinte:

O que muda nesses dois tipos (float, long) é a forma como
esses dois caras armazenam os seus bits que representam seu valor:

o resultado é :

explicando então…
ao se passar um long a um float, o Java utiliza os bits exponenciais do float para armazenar o calculo q atingirá o mesmo valor do long.

sendo assim: 9223372036854775807 eh exatamente igual a 9.223372 elevado a 18 exponencial. :slight_smile:

Q

9.223372 vezes 10 elevado a 18

wikipedia > otação científica
wikipedia > ponto flutuante

flw, t+

V

Não é igual, Gustavo. A explicação do Miojo (de onde vc provavelmente copiou a sua) contém um erro.
9223372036854775807 é diferente de 9223372000000000000. Existe perda de precisão.

O que a especificação diz, na verdade, é isso aqui:

“Especificação”:
Widening primitive conversions do not lose information about the overall magnitude of a numeric value. Indeed, conversions widening from an integral type to another integral type do not lose any information at all; the numeric value is preserved exactly. Conversions widening from float to double in strictfp expressions also preserve the numeric value exactly; however, such conversions that are not strictfp may lose information about the overall magnitude of the converted value.

Conversion of an int or a long value to float, or of a long value to double, may result in loss of precision-that is, the result may lose some of the least significant bits of the value. In this case, the resulting floating-point value will be a correctly rounded version of the integer value, using IEEE 754 round-to-nearest mode (§4.2.4).

Ou seja, essa perda de precisão é permitida nesse tipo de conversão. Foi uma decisão de projeto, para a linguagem não te pentelhar tanto com casts. É uma perda de precisão menos significativa, pois ocorre em bits menos significativos, não nos mais, como ocorre com os downcasts.

Agora, vamos e venhamos, o número 36.854.775.807 não é um valor pequeno e dependendo do que você queria se referir, isso vai dar uma enorme dor de cabeça.

G

blz galera !!

Resolvido então !! :roll:

Criado 12 de julho de 2010
Ultima resposta 12 de jul. de 2010
Respostas 4
Participantes 3