Estaba probando lo que se devolvió de la división, incluidos ceros 0/1
, es decir , 1/0
y 0/0
. Para esto utilicé algo similar a lo siguiente:
Console.WriteLine(1d / 0d);
Sin embargo, este código 8
no imprime Infinity
o alguna otra cadena constante como PositiveInfinity
.
Para completar todas las siguientes impresiones 8
:
Console.WriteLine(1d / 0d);
double value = 1d / 0d;
Console.WriteLine(value);
Console.WriteLine(Double.PositiveInfinity);
Y Console.WriteLine(Double.NegativeInfinity);
grabados -8
.
¿Por qué este infinito imprime 8?
Para aquellos de ustedes que parecen pensar que este es un símbolo de infinito, no un ocho, el siguiente programa:
Console.WriteLine(1d / 0d);
double value = 1d / 0d;
Console.WriteLine(value);
Console.WriteLine(Double.PositiveInfinity);
Console.WriteLine(8);
Salidas:
∞
es el signo del infinito. solo voltéalo 90 grados para verlo 88
personaje Unicode real , no extraño para infinito, girado 90 grados? Esto podría cambiar en función de su entorno local. Lo probé en dotnetfiddle.net y se imprimeInfinity
.Double.PositiveInfinity.ToString()[0] == '8'
. Hay algunos caracteres exóticos que se parecen mucho a otros en algunas fuentes. Además, ¿en qué idioma está configurada su computadora?8
(configuración regional en alemán).Console.Write("∞");
Respuestas:
Tenga la seguridad de que el valor de coma flotante es
+Infinity
si el numerador de una división de coma flotante por cero es positivo,-Infinity
si el numerador de una división de coma flotante por cero es negativo, yNaN
si el numerador y el denominador de una división de coma flotante son ambos cero. Eso está en la especificación de punto flotante IEEE754 , que es lo que usa C #.En su caso, la consola está convirtiendo el símbolo de infinito (que a veces se representa tipográficamente como un 8 - horizontal horizontal) en un 8 vertical.
fuente
Infinity
o similar, incluso si uso el código de la respuesta? Soren al especificar la culturaDadas ciertas configuraciones (es decir, combinación de culturas, codificación de salida, etc.) .NET generará el carácter de infinito Unicode ∞ (∞ / & # 8734;). El emulador de consola / terminal de Windows 10 (una vez más, dada cierta configuración, vea la captura de pantalla a continuación) mostrará este carácter Unicode como un 8.
Por ejemplo, en Windows 10, con la configuración a continuación (observe la página de códigos) simplemente pegando ∞ en la consola se muestra como 8.
EDITAR
Con agradecimiento al comentario de Chris : Parece que la fuente de salida en combinación con la página de códigos es responsable del problema ∞ => 8 en la consola. Al igual que él, obtengo una visualización adecuada de ∞ en todas las fuentes TrueType que he probado y solo veo 8 cuando se selecciona 'fuentes ráster'.
fuente
El
8
símbolo aparece cuando Windows convierte Unicode en una codificación de caracteres heredada. Como no hay un símbolo de infinito en la codificación heredada, utiliza un "mejor ajuste" a ese símbolo, de forma predeterminada , que en este caso es el número 8. Vea un ejemplo para la codificación "windows-1252" de Microsoft . Aparentemente, Windows 10 todavía usa codificaciones de caracteres heredados por defecto en la consola (consulte "Páginas de códigos" ).fuente
Nota: La
.ToString()
llamada al método implícito al escribirDouble.PositiveInfinity
en la consola es responsable de este comportamiento.Vocación
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));
da como resultado la cadena "Infinito"
while
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr")));
resulta en "+ Infini".Editar: como otros han señalado en los comentarios, no pueden confirmar completamente mis resultados. Al probar esto en una máquina diferente, obtengo el carácter
∞
para ambas llamadas.Salida para todas las culturas , gracias a vtortola en los comentarios.
Encontré una respuesta (probable):
Usando
Console.OutputEncoding = Encoding.Unicode;
puedo recrear el comportamiento que está experimentando para varias culturas, por ejemplo, "ru", "ru-RU" producen el resultado8
.fuente
Infinity
en ambos. ¿Cuál es la cultura que ejecuta su aplicación? CompruebeThread.CurrentThread.CurrentCulture
yThread.CurrentThread.CurrentUICulture
.8
dotnetfiddle.net/QYhXMu.ToString()
. Al final,ToString()
devolverá el.PositiveInfinitySymbol
de lo relevanteNumberFormatInfo
. Estos parecen depender de la versión del tiempo de ejecución y / o la versión de Windows (o cualquier sistema operativo). En los viejos tiempos,CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
sería igual a"Infinity"
, pero con versiones más nuevas del tiempo de ejecución y el sistema operativo lo es"∞"
. Solo pregunté al respecto en un comentario a la respuesta de Hans Passant en este hilo.Código de repro:
La página de códigos 1252 es un accidente bastante común en Inglaterra ya que es la página de códigos predeterminada de Windows allí. Como lo es para Europa Occidental y las Américas. Muchas razones para cambiar la propiedad predeterminada Console.OutputEncoding mediante programación, muchos archivos de texto se codificarán en 1252. O desde la línea de comandos escribiendo
chcp 1252
(chcp == cambiar página de códigos) antes de iniciar el programa.Como puede deducir del conjunto de caracteres admitido por 1252, el símbolo Infinito no está disponible. Entonces la codificación tiene que llegar a un sustituto. Ese es a menudo el
?
glifo para puntos de código Unicode no compatibles, el valor de la propiedad Encoding.EncoderFallback para codificaciones de 8 bits. Pero para 1252, y las antiguas páginas de códigos MS-Dos 850 y 858, el programador de Microsoft decidió8
. Chico divertido.El glifo es compatible con la página de códigos habitual para aplicaciones de consola en una máquina occidental. Que es 437, coincide con el juego de caracteres heredado de IBM . Tener este tipo de desastres de codificación es la razón por la cual se inventó Unicode. Lamentablemente, es demasiado tarde para rescatar aplicaciones de consola, demasiado código que dependía de la página de códigos MS-Dos predeterminada.
Tener Double.PositiveInfinity convertido a "∞" es específico de Win10. Solía ser "Infinito" en versiones anteriores de Windows. Este tipo de formatos normalmente se puede modificar con el Panel de control> Idioma> Cambiar formatos de fecha, hora o número> botón Configuración adicional, pero la selección del símbolo de infinito no se incluye en el cuadro de diálogo. Tampoco está cubierto por el registro (HKCU \ Control Panel \ International), sino una gran supervisión. Es LOCALE_SPOSINFINITY en el winapi nativo. En un programa .NET, puede anularlo mediante programación clonando CultureInfo y cambiando su propiedad NumberFormatInfo.PositiveInfinitySymbol. Me gusta esto:
fuente
ý
lugar de∞
. También me mostró que el uso de fuentes no ráster evita el problema.CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
da"Infinity"
o"∞"
(o algo más)? Usted dice anteriormente que es específico de Windows 10, y estoy de acuerdo en que se modificó en algún momento. Pero si ejecuto una aplicación en Windows 8 con "la misma" versión de .NET Framework , ¿obtendré un resultado diferente que con Windows 10?$PSVersionTable
revela que la versión PS es algo con 5.1. Ese PowerShell está dirigido a .NET Framework (CLR) versión 4. *, que sé que es nuevo en esa máquina. Todavía[cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
de Windows PowerShell daInfinity
, no∞
(la cultura actual esen-US
). Conclusión: la versión de Windows decide, no la versión .NET."8" para infinito se muestra en la consola cuando se ejecuta .Net 4 y superior, de lo contrario, las versiones anteriores muestran "Infinito".
Usando Console.OutputEncoding = Encoding.Unicode; en .Net 4 y superior obtendrá infinito para mostrar como ∞, pero arroja una IOException en versiones anteriores.
NOTA: estoy ejecutando Visual Studio 2015 Community Edition en Windows 10 de 64 bits
fuente