Eu estava testando o que foi retornado da divisão, incluindo zeros 0/1
, ie , 1/0
e 0/0
. Para isso, usei algo semelhante ao seguinte:
Console.WriteLine(1d / 0d);
No entanto, esse código 8
não imprime Infinity
ou alguma outra string constante como PositiveInfinity
.
Para completar, todas as seguintes impressões 8
:
Console.WriteLine(1d / 0d);
double value = 1d / 0d;
Console.WriteLine(value);
Console.WriteLine(Double.PositiveInfinity);
E Console.WriteLine(Double.NegativeInfinity);
imprime -8
.
Por que esse infinito imprime 8?
Para aqueles que parecem pensar que este é um símbolo do infinito e não um oito, o seguinte programa:
Console.WriteLine(1d / 0d);
double value = 1d / 0d;
Console.WriteLine(value);
Console.WriteLine(Double.PositiveInfinity);
Console.WriteLine(8);
Saídas:
∞
é o sinal do infinito. basta girá-lo 90 graus para vê-lo 88
caractere Unicode real , não estranho, para o infinito, girado 90 graus? Isso pode mudar com base no seu código de idioma. Eu tentei no dotnetfiddle.net e ele imprimeInfinity
.Double.PositiveInfinity.ToString()[0] == '8'
. Existem alguns caracteres exóticos que se parecem muito com outros em algumas fontes. Além disso, em qual idioma o seu computador está configurado?8
(localidade alemã).Console.Write("∞");
Respostas:
Certifique-se de que o valor do ponto flutuante seja
+Infinity
se o numerador de uma divisão de ponto flutuante por zero for positivo,-Infinity
se o numerador de uma divisão de ponto flutuante por zero for negativo eNaN
se o numerador e o denominador de uma divisão de ponto flutuante forem zero. Isso está na especificação de ponto flutuante IEEE754 , que é o que o C # usa.No seu caso, o console está convertendo o símbolo do infinito (que às vezes é representado tipograficamente como um 8 - horizontal horizontal) em um 8 vertical.
fonte
Infinity
ou semelhante, mesmo que eu use o código da resposta por Soren especificando a culturaDadas determinadas configurações (por exemplo, combinação de culturas, codificação de saída etc.), o .NET emitirá o caractere infinito Unicode ∞ (∞ / & # 8734;). O emulador de console / terminal do Windows 10 (novamente com determinadas configurações - veja a captura de tela abaixo) exibirá esse caractere Unicode como um 8.
Por exemplo, no Windows 10, com as configurações abaixo (observe a página de códigos), basta colar ∞ no console como 8.
EDITAR
Com agradecimentos ao comentário de Chris : Parece que a fonte de saída em combinação com a página de código é responsável pelo problema ∞ => 8 no console. Como ele, obtenho uma exibição adequada de ∞ em todas as fontes TrueType que eu tentei e só vejo 8 quando as fontes raster 'são escolhidas.
fonte
O
8
símbolo ocorre quando o Windows converte Unicode em uma codificação de caracteres herdados. Como não há símbolo de infinito na codificação herdada, ele usa um "melhor ajuste" para esse símbolo, por padrão , que neste caso é o número 8. Veja um exemplo da codificação "windows-1252" da Microsoft . Aparentemente, o Windows 10 ainda usa codificações de caracteres herdadas por padrão no console (consulte "Páginas de código" ).fonte
Nota: A
.ToString()
chamada implícita do método ao gravarDouble.PositiveInfinity
no console é responsável por esse comportamento.Chamando
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));
resulta na string "Infinito"
enquanto
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr")));
resulta em "+ Infini".Edit: Como outros já apontaram nos commets, eles não podem confirmar totalmente meus resultados. Testando isso em uma máquina diferente, recebo o caractere
∞
para as duas chamadas.Saída para todas as culturas , graças a vtortola nos comentários.
Encontrei uma resposta (provável):
Usando
Console.OutputEncoding = Encoding.Unicode;
Eu posso recriar o comportamento que você está enfrentando para várias culturas, por exemplo, "ru", "ru-RU" produz a saída8
.fonte
Infinity
nos dois. Qual é a cultura que seu aplicativo está executando? VerifiqueThread.CurrentThread.CurrentCulture
eThread.CurrentThread.CurrentUICulture
.8
dotnetfiddle.net/QYhXMu.ToString()
. No final,ToString()
retornará o.PositiveInfinitySymbol
do relevanteNumberFormatInfo
. Eles parecem depender da versão do tempo de execução e / ou da versão do Windows (ou de qualquer SO). Antigamente,CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
seria igual a"Infinity"
, mas nas versões mais recentes do tempo de execução e do sistema operacional, é o mesmo"∞"
. Eu apenas perguntei sobre isso em um comentário à resposta de Hans Passant neste tópico.Código de reprodução:
A página de código 1252 é um acidente bastante comum na Inglaterra, pois é a página de código padrão do Windows lá. Como é para a Europa Ocidental e as Américas. Vários motivos para alterar a propriedade padrão Console.OutputEncoding programaticamente, muitos arquivos de texto serão codificados em 1252. Ou na linha de comando, digitando
chcp 1252
(chcp == alterar a página de código) antes de iniciar o programa.Como você pode ver no conjunto de caracteres suportado por 1252, o símbolo Infinito não está disponível. Portanto, a codificação precisa de um substituto. Esse geralmente é o
?
glifo para pontos de código Unicode não suportados, o valor da propriedade Encoding.EncoderFallback para codificações de 8 bits. Mas, para 1252, e as páginas de códigos herdadas do MS-Dos 850 e 858, o programador da Microsoft decidiu8
. Cara engraçado.O glifo é suportado na página de códigos usual para aplicativos de console em uma máquina Western. Qual é 437, corresponde ao conjunto de caracteres herdado da IBM . Ter esse tipo de desastre de codificação é o motivo pelo qual o Unicode foi inventado. Infelizmente, é tarde demais para resgatar aplicativos de console, muito código em torno dele se baseia na página de código padrão do MS-Dos.
A conversão de Double.PositiveInfinity para "∞" é específica do Win10. Costumava ser "Infinito" nas versões anteriores do Windows. Normalmente, esses tipos de formatos podem ser modificados com o botão Painel de controle> Idioma> Alterar formatos de data, hora ou número> Configurações adicionais, mas a seleção do símbolo de infinito não está incluída na caixa de diálogo. Também não é coberto pelo registro (HKCU \ Control Panel \ International), mas por uma grande supervisão. É LOCALE_SPOSINFINITY no winapi nativo. Em um programa .NET, você pode substituí-lo programaticamente, clonando o CultureInfo e alterando sua propriedade NumberFormatInfo.PositiveInfinitySymbol. Como isso:
fonte
ý
vez de∞
. Também me mostrou que o uso de fontes não rasterizadas evita o problema.CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
dá"Infinity"
ou"∞"
(ou outra coisa)? Você diz acima que é específico para o Windows 10 e concordo que foi alterado em algum momento. Mas se eu executar um aplicativo no Windows 8 com a versão "mesma" do .NET Framework , obterá um resultado diferente do Windows 10?$PSVersionTable
revela que a versão PS é algo com 5.1. Esse PowerShell tem como alvo o .NET Framework (CLR) versão 4. *, que eu sei que é novo nessa máquina. Ainda[cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
do Windows PowerShell ofereceInfinity
, não∞
(a cultura atual éen-US
). Conclusão: a versão do Windows decide, não a versão do .NET."8" para infinito é exibido no console ao executar o .Net 4 e superior; caso contrário, as versões anteriores exibem "Infinito".
Using Console.OutputEncoding = Encoding.Unicode; no .Net 4 e acima, o infinito será exibido como ∞, mas lança uma IOException nas versões anteriores.
NOTA: Estou executando o Visual Studio 2015 Community Edition no Windows 10 de 64 bits
fonte