web-dev-qa-db-fra.com

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

J'essayais ce qui était retourné d'une division, y compris les zéros, à savoir 0/1, 1/0 et 0/0. Pour cela, j'ai utilisé quelque chose de similaire à ce qui suit:

Console.WriteLine(1d / 0d);

Cependant, ce code imprime 8 et non Infinity ou une autre constante constante telle que PositiveInfinity.

Pour être complet, tous les éléments suivants doivent être imprimés 8:

Console.WriteLine(1d / 0d);

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

Console.WriteLine(Double.PositiveInfinity);

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

Pourquoi cet infini imprime-t-il 8?


Pour ceux d'entre vous qui semblent penser que c'est un symbole de l'infini et non un huit, le programme suivant:

Console.WriteLine(1d / 0d);

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

Console.WriteLine(Double.PositiveInfinity);

Console.WriteLine(8);

Les sorties:

Inifinity output

143
TheLethalCoder

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

Dans votre cas, la console convertit le symbole de l'infini (qui est parfois représenté typographiquement sous la forme d'un 8 - ∞ horizontal) en un 8 vertical.

109
Bathsheba

Avec certains réglages (combinaison de cultures, codage de sortie, etc.), NET générera le caractère Unicode infini ∞ (/ # 8734;). L'émulateur de console/terminal Windows 10 affichera (à nouveau certains paramètres - voir capture d'écran ci-dessous) ce caractère Unicode sous la forme d'un 8.

Par exemple, sous Windows 10, avec les paramètres ci-dessous (notez la page de code), le simple fait de coller ∞ dans la console indique 8.

Setting to reproduce

EDIT

Avec merci au commentaire de Chris : Il semble que la police de sortie en combinaison avec la page de code est responsable de la = > 8 problème sur la console. Comme lui, je reçois un affichage correct de ∞ dans toutes les polices TrueType que j'ai essayées et ne vois que 8 lorsque les polices raster sont choisies.

font settings

70
tolanj

Le symbole 8 apparaît lorsque Windows convertit Unicode en un codage de caractères hérité. Comme il n'y a pas de symbole infini dans le codage hérité, il utilise un "meilleur ajustement" pour ce symbole, par défaut , qui est dans ce cas le nombre 8. Voir un exemple pour Microsoft "windows-1252" encodage . Apparemment, Windows 10 utilise toujours des codages de caractères hérités par défaut dans la console (voir "Pages de code" ).

38
Peter O.

Remarque: L'appel de méthode implicite .ToString() lors de l'écriture de Double.PositiveInfinity sur la console est responsable de ce problème.

Appel de Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));

résulte dans la chaîne "Infinity"

tandis que Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr"))); donne "+ Infini".

Edit: Comme d'autres l'ont souligné dans les commets, ils ne peuvent pas entièrement confirmer mes résultats. En testant ceci sur une machine différente, je reçois le caractère pour les deux appels.

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


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

En utilisant Console.OutputEncoding = Encoding.Unicode; je peux recréer le comportement que vous rencontrez pour plusieurs cultures, par exemple. "ru", "ru-RU" produisent la sortie 8.

35
Søren D. Ptæus

Code de repro:

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 codes 1252 est un accident assez courant en Angleterre puisqu'il s'agit de la page de codes Windows par défaut. Comme pour l'Europe occidentale et les Amériques. De nombreuses raisons de modifier la propriété par défaut Console.OutputEncoding par programme, de nombreux fichiers texte seront codés en 1252. Ou à partir de la ligne de commande en tapant chcp 1252 (chcp == changer la page de code) avant de démarrer le programme.

Comme vous pouvez le voir à partir de le jeu de caractères pris en charge par 1252, le symbole Infinity n'est pas disponible. Le codage doit donc proposer un substitut. C'est souvent le glyphe ? pour les points de code Unicode non pris en charge, la valeur de la propriété Encoding.EncoderFallback pour les codages à 8 bits. Mais pour 1252 et les pages de code héritées MS-Dos 850 et 858, le programmeur Microsoft a décidé de choisir 8. Mec marrant.

Le glyphe est pris en charge dans la page de code habituelle pour les applications de console sur une machine occidentale. Ce qui est 437, correspond au jeu de caractères IBM hérité . C’est pour cela que l’Unicode a été inventé. Malheureusement, il est trop tard pour récupérer les applications de la console, beaucoup trop de code reposant sur la page de code par défaut de MS-Dos.

La conversion de Double.PositiveInfinity en "" est spécifique à Win10. C'était autrefois "Infinity" dans les versions précédentes de Windows. Ce type de formats peut normalement être modifié avec Panneau de configuration> Langue> Modifier les formats de date, d’heure ou de nombre> bouton Paramètres supplémentaires, mais la sélection du symbole de l’infini n’est pas incluse dans la boîte de dialogue. Également non couvert par le registre (HKCU\Panneau de configuration\International), plutôt un oubli important. C'est LOCALE_SPOSINFINITY dans le winapi natif. Dans un programme .NET, vous pouvez le remplacer par programme en clonant CultureInfo et en modifiant sa propriété NumberFormatInfo.PositiveInfinitySymbol. Comme ça:

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();
    }
}
15
Hans Passant

"8" pour l'infini est affiché dans la console lors de l'exécution de .Net 4 ou supérieur, sinon les versions précédentes affichent "Infinity".

Using Console.OutputEncoding = Encoding.Unicode; Dans .Net 4 et supérieur, l'infini s'affichera comme, mais lève une exception IOException dans les versions précédentes.

REMARQUE: J'utilise Visual Studio 2015 Community Edition sous Windows 10 64 bits.

0
JTC