Se você está perguntando "para que serve o NaN?" em Java (ou qualquer outra linguagem), posso dar-lhe um caso de uso em que é muito útil: quando tenho uma matriz 2-D de flutuadores, mas meu cálculo não tem valor significativo para alguma parte dessa matriz 2-D, Vou preencher esse valor com "NaN". Isso pode ser usado para sinalizar aos usuários downstream do meu cálculo (como quando ele é transformado em uma imagem raster) "não preste atenção ao valor neste momento". Muito útil!
Dan H
BTW, o que - exatamente - significa "encolher" um duplo? Curioso ...
"NaN" significa "não é um número". "Nan" é produzido se uma operação de ponto flutuante tiver alguns parâmetros de entrada que fazem com que a operação produza algum resultado indefinido. Por exemplo, 0,0 dividido por 0,0 é aritmeticamente indefinido. Tirar a raiz quadrada de um número negativo também é indefinido.
Além disso, o NaN é definido pelo Padrão IEEE para Aritmética de Ponto Flutuante (IEEE 754) de forma bastante explícita, que Java segue cegamente. Ler o padrão abre seus olhos para muitas coisas, os múltiplos valores de zero sendo uma delas.
Esko
37
Além disso, NaNtem a interessante propriedade de ser o único "número" que não é igual a si mesmo quando comparado. Portanto, um comum (e em muitas línguas a única) de teste se um número xé NaNo seguinte:boolean isNaN(x){return x != x;}
quazgar
3
O link em resposta está morto?
Pang
3
... "Tirar a raiz quadrada de um número negativo é indefinido (em aritmética)" ... Não é! é na verdade ie algumas linguagens como o python lidam muito bem com isso ... Pode não ser o caso em javatu
Rafael T
5
@RafaelT Eu diria que é indefinido na aritmética não complexa. Não há como atribuir um número complexo a um número flutuante ou duplo em Java. Python é digitado dinamicamente, portanto, pode ser apenas para retornar um número complexo neste caso.
sstn
19
NaNsignifica “Não é um número” e é basicamente uma representação de um valor de ponto flutuante especial no padrão de ponto flutuante IEE 754 . NaN geralmente significa que o valor é algo que não pode ser expresso com um número de ponto flutuante válido.
Uma conversão resultará neste valor, quando o valor que está sendo convertido é outro, por exemplo, ao converter uma string que não representa um número.
Convertendo como? Com parseFloat()ou parseDouble? Ou alguma outra coisa?
Alonso del Arte
14
NaNsignifica "Não é um número" e é o resultado de operações indefinidas em números de ponto flutuante como, por exemplo, dividir zero por zero. (Observe que, embora dividir um número diferente de zero por zero também seja geralmente indefinido em matemática, isso não resulta em NaN, mas em infinito positivo ou negativo).
NaNsignifica "Não é um número". É um valor de ponto flutuante especial que significa que o resultado de uma operação não foi definido ou não pode ser representado como um número real.
A primeira coisa que você precisa saber é que o conceito de NaN é implementado diretamente no hardware da CPU.
Todas as principais CPUs modernas parecem seguir IEEE 754 que especifica formatos de ponto flutuante, e NaNs, que são apenas valores flutuantes especiais, fazem parte desse padrão.
Portanto, o conceito será muito semelhante em qualquer linguagem, incluindo Java, que apenas emite código de ponto flutuante diretamente para a CPU.
Antes de continuar, você pode querer ler primeiro as seguintes respostas que escrevi:
Não sou um cara Java, mas em JS e outras linguagens eu uso "Not a Number", o que significa que alguma operação fez com que ele se tornasse um número inválido.
Eu discordo com esta resposta. Primeiro: "NaN" É um valor válido para um float IEEE! (Afinal, ele está definido na especificação ... então é "válido", certo?). Segundo: "divisão por zero" pode ser representada por IEEE "Infinito Positivo" ou "Infinito Negativo"; um exemplo melhor de "NaN" é "zero dividido por zero", como algumas outras respostas indicaram corretamente.
Dan H
"Valor válido" e "definido nas especificações" não são a mesma coisa. Concordado com 0/0.
Respostas:
Retirado desta página :
fonte
NaN
tem a interessante propriedade de ser o único "número" que não é igual a si mesmo quando comparado. Portanto, um comum (e em muitas línguas a única) de teste se um númerox
éNaN
o seguinte:boolean isNaN(x){return x != x;}
i
e algumas linguagens como o python lidam muito bem com isso ... Pode não ser o caso emjava
tuNaN
significa “Não é um número” e é basicamente uma representação de um valor de ponto flutuante especial no padrão de ponto flutuante IEE 754 . NaN geralmente significa que o valor é algo que não pode ser expresso com um número de ponto flutuante válido.Uma conversão resultará neste valor, quando o valor que está sendo convertido é outro, por exemplo, ao converter uma string que não representa um número.
fonte
parseFloat()
ouparseDouble
? Ou alguma outra coisa?NaN
significa "Não é um número" e é o resultado de operações indefinidas em números de ponto flutuante como, por exemplo, dividir zero por zero. (Observe que, embora dividir um número diferente de zero por zero também seja geralmente indefinido em matemática, isso não resulta em NaN, mas em infinito positivo ou negativo).fonte
NaN
significa "Não é um número". É um valor de ponto flutuante especial que significa que o resultado de uma operação não foi definido ou não pode ser representado como um número real.Veja aqui mais explicações sobre este valor.
fonte
NaN significa Não é um número. É usado para significar qualquer valor que seja matematicamente indefinido. Como dividir 0,0 por 0,0. Você pode procurar aqui para obter mais informações: https://web.archive.org/web/20120819091816/http://www.concentric.net/~ttwang/tech/javafloat.htm
Poste seu programa aqui se precisar de mais ajuda.
fonte
NaN = Não é um número.
fonte
Significa não um número. É uma representação comum para um valor numérico impossível em muitas linguagens de programação.
fonte
Exemplo de execução mínima
A primeira coisa que você precisa saber é que o conceito de NaN é implementado diretamente no hardware da CPU.
Todas as principais CPUs modernas parecem seguir IEEE 754 que especifica formatos de ponto flutuante, e NaNs, que são apenas valores flutuantes especiais, fazem parte desse padrão.
Portanto, o conceito será muito semelhante em qualquer linguagem, incluindo Java, que apenas emite código de ponto flutuante diretamente para a CPU.
Antes de continuar, você pode querer ler primeiro as seguintes respostas que escrevi:
Agora, para alguma ação Java. A maioria das funções de interesse que não estão na linguagem central estão internamente
java.lang.Float
.Nan.java
GitHub upstream .
Correr com:
Resultado:
Assim, aprendemos algumas coisas:
operações flutuantes estranhas que não têm nenhum resultado lógico fornecem NaN:
0.0f / 0.0f
sqrt(-1.0f)
log(-1.0f)
gerar a
NaN
.Em C, é realmente possível solicitar o aumento de sinais em tais operações
feenableexcept
para detectá-los, mas não acho que seja exposto em Java: Por que a divisão inteira por zero 1/0 dá erro, mas ponto flutuante 1 / 0,0 retorna "Inf"?operações estranhas que estão no limite de mais ou menos infinito, no entanto, dão + - infinito em vez de NaN
1.0f / 0.0f
log(0.0f)
0.0
quase cai nesta categoria, mas provavelmente o problema é que ele poderia ir para mais ou menos infinito, então foi deixado como NaN.se NaN for a entrada de uma operação flutuante, a saída também tende a ser NaN
existem vários valores possíveis para NaN
0x7fc00000
,0x7fc00001
,0x7fc00002
, embora x86_64 parece gerar apenas0x7fc00000
.NaN e infinito têm representação binária semelhante.
Vamos analisar alguns deles:
A partir disso, confirmamos o que IEEE754 especifica:
Os NaNs podem ser positivos ou negativos (bit superior), embora isso não tenha efeito sobre as operações normais
Testado no Ubuntu 18.10 amd64, OpenJDK 1.8.0_191.
fonte
Não sou um cara Java, mas em JS e outras linguagens eu uso "Not a Number", o que significa que alguma operação fez com que ele se tornasse um número inválido.
fonte
Literalmente significa "Não é um número". Suspeito que algo está errado com seu processo de conversão.
Verifique a seção Não é um número nesta referência
fonte
Não é um valor de ponto flutuante válido (por exemplo, o resultado da divisão por zero)
http://en.wikipedia.org/wiki/NaN
fonte