155 votes

Pourquoi l'infini est-il imprimé en tant que "8" dans la console Windows 10?

J'ai été le tester ce qui a été renvoyé de la division, y compris les zéros c'est à dire 0/1, 1/0 et 0/0. Pour cela, j'ai utilisé quelque chose de similaire à la suivante:

Console.WriteLine(1d / 0d);

Toutefois, ce code imprime 8 pas Infinity ou une autre chaîne constante comme PositiveInfinity.

L'exhaustivité de l'ensemble de la suite imprimer 8:

Console.WriteLine(1d / 0d);

double value = 1d / 0d;
Console.WriteLine(value);

Console.WriteLine(Double.PositiveInfinity);

Et Console.WriteLine(Double.NegativeInfinity); tirages -8.

Pourquoi est-ce à l'infini d'impression 8?


Pour ceux d'entre vous qui semblez penser que c'est un symbole de l'infini pas un huit le programme suivant:

Console.WriteLine(1d / 0d);

double value = 1d / 0d;
Console.WriteLine(value);

Console.WriteLine(Double.PositiveInfinity);

Console.WriteLine(8);

Sorties:

Inifinity output

114voto

Bathsheba Points 23209

Soyez assuré que la valeur à virgule flottante est - +Infinity si le numérateur de virgule flottante de la division par zéro est positif, -Infinity si le numérateur de virgule flottante de la division par zéro est négatif, et NaN si le numérateur et le dénominateur d'une division à virgule flottante sont tous deux nuls. C'est dans le IEEE754 virgule flottante spécification, qui est ce que C# utilise.

Dans votre cas, la console est en train de convertir le symbole de l'infini (ce qui est parfois représentée sous forme typographique horizontale 8 - ∞) verticale 8.

72voto

tolanj Points 1157

Compte tenu de certains paramètres (combinaison de cultures, d'encodage de sortie, etc.) .NET sera de sortie le format Unicode caractère infini ∞ (∞ / ∞). Windows 10 console/terminal emulator va (à nouveau compte tenu de certains paramètres voir capture d'écran ci-dessous) afficher ce caractère Unicode comme un 8.

Par exemple, sur Windows 10, avec les paramètres (notez le code de la page), il suffit de coller ∞ dans la console affiche que 8.

Setting to reproduce

MODIFIER

Grâce à un commentaire de Chris: Il semble que la police de sortie en combinaison avec la page de code est responsable de l' ∞ => 8 question sur la console. Comme lui je obtenir un bon affichage de ∞ dans toutes les polices TrueType, j'ai essayé et voir seulement 8 lorsque les polices raster " est choisi.

font settings

42voto

Peter O. Points 9967

L' 8 symbole se produit lorsque Windows convertit Unicode à un héritage de codage de caractères. Depuis il n'y a pas de symbole de l'infini dans l'héritage de l'encodage, il utilise un "meilleur ajustement" à ce symbole, par défaut, qui dans ce cas est le numéro 8. Voir un exemple de Microsoft "windows-1252" encoding. Apparemment, Windows 10 encore utilise l'héritage des codages de caractères par défaut dans la console (voir "les Pages de Code").

35voto

Søren D. Ptæus Points 853

Remarque: L'implicite .ToString() appel de la méthode lors de l'écriture d' Double.PositiveInfinity à la console est responsable de ce comportement.

L'appel Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));

les résultats dans la chaîne de "l'Infini"

alors qu' Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr"))); résultats dans "+Infini".

Edit: Comme d'autres l'ont souligné dans les commets, ils ne peuvent pas entièrement confirmer mes résultats. Test sur une autre machine, j'obtiens le caractère pour les deux appels.

De sortie pour toutes les cultures, grâce à vtortola dans les commentaires.


J'ai trouvé une (probable) réponse:

À l'aide de Console.OutputEncoding = Encoding.Unicode; je peux recréer le problème que vous rencontrez pour plusieurs cultures, par exemple, "ru", "ru-ru" produire de la sortie 8.

17voto

Hans Passant Points 475940

Repro code:

using System;
using System.Text;

class Program {
    static void Main(string[] args) {
        var infinity = "\u221e";
        Console.OutputEncoding = Encoding.GetEncoding(1252);
        Console.WriteLine(infinity);
        Console.ReadLine();
    }
}

La page de Code 1252 est une jolie commune accident en Angleterre puisque c'est la valeur par défaut page de code Windows. Comme il l'est pour l'Ouest de l'Europe et les Amériques. Beaucoup de raisons de modifier la valeur par défaut de la Console.OutputEncoding propriété de la programmation, de nombreux fichiers de texte est encodé en 1252. Ou en ligne de commande en tapant chcp 1252 (rssa == modifier la page de code) avant de commencer le programme.

Comme vous pouvez le dire à partir du jeu de caractères pris en charge par 1252, le symbole de l'Infini n'est pas disponible. Ainsi, le Codage doit venir avec un substitut. C'est souvent l' ? glyphe non pris en charge Unicode codepoints, l'Encodage.EncoderFallback valeur de la propriété pour 8-bit encodages. Mais pour 1252, et l'héritage de MS-Dos 850 et 858 pages de code, le programmeur Microsoft a décidé de 8. Drôle de type.

Le glyphe est pris en charge dans l'habitude de la page de code de la console apps sur l'Ouest de la machine. Qui est 437, correspond à l'héritage IBM jeu de caractères. Avoir ce genre de codage des catastrophes est pourquoi Unicode a été inventé. Malheureusement trop tard pour sauver la console d'applications, beaucoup trop de code autour de qui s'appuient sur la valeur par défaut de MS-Dos de la page de code.

Avoir Le Double.PositiveInfinity convertis "∞" est spécifique à Win10. Il sert à être "Infini" dans les versions précédentes de Windows. Ces types de formats peuvent normalement être modifié avec Panneau de configuration > Langue > Changement de date, d'heure ou de numéro de formats > Paramètres Supplémentaires le bouton, mais le symbole de l'infini de sélection n'est pas inclus dans la boîte de dialogue. Également pas couverts par la base de registre (HKCU\Control Panel\International), plutôt une grande surveillance. Il est LOCALE_SPOSINFINITY dans le natif winapi. Dans une .NET programme, vous pouvez le remplacer par programmation par clonage CultureInfo et la modification de son NumberFormatInfo.PositiveInfinitySymbol de la propriété. Comme ceci:

using System;
using System.Text;
using System.Threading;
using System.Globalization;

class Program {
    static void Main(string[] args) {
        Console.OutputEncoding = Encoding.GetEncoding(1252);
        var ci = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
        ci.NumberFormat.NegativeInfinitySymbol = "-Infinity";
        ci.NumberFormat.PositiveInfinitySymbol = "And beyond";
        Thread.CurrentThread.CurrentCulture = ci;
        Console.WriteLine(1 / 0.0);
        Console.ReadLine();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X