Je testais ce qui était retourné de la division, y compris les zéros, c'est 0/1
-à- dire 1/0
et 0/0
. Pour cela, j'ai utilisé quelque chose de similaire à ce qui suit:
Console.WriteLine(1d / 0d);
Cependant, ce code n'imprime 8
pas Infinity
ou une autre constante de chaîne comme PositiveInfinity
.
Par souci d'exhaustivité, toutes les impressions suivantes 8
:
Console.WriteLine(1d / 0d);
double value = 1d / 0d;
Console.WriteLine(value);
Console.WriteLine(Double.PositiveInfinity);
Et des Console.WriteLine(Double.NegativeInfinity);
impressions -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:
∞
c'est le signe de l'infini. il suffit de le retourner à 90 degrés pour le voir 88
caractère Unicode réel , pas un étrange caractère pour l'infini, pivoté de 90 degrés? Cela pourrait changer en fonction de vos paramètres régionaux. Je l'ai essayé sur dotnetfiddle.net et il s'imprimeInfinity
.Double.PositiveInfinity.ToString()[0] == '8'
. Certains caractères exotiques ressemblent beaucoup à d'autres dans certaines polices. De plus, dans quelle langue votre ordinateur est-il configuré?8
(langue allemande).Console.Write("∞");
Réponses:
Soyez assuré que la valeur en virgule flottante est
+Infinity
si le numérateur d'une division en virgule flottante par zéro est positif,-Infinity
si le numérateur d'une division en virgule flottante par zéro est négatif, etNaN
si le numérateur et le dénominateur d'une division en virgule flottante sont tous deux zéro. C'est dans la spécification à virgule flottante IEEE754 , ce qu'utilise C #.Dans votre cas, la console convertit le symbole de l'infini (qui est parfois représenté typographiquement comme un 8 horizontal - ∞) en un 8 vertical.
la source
Infinity
ou similaire même si j'utilise le code de la réponse par Soren en spécifiant la cultureCompte tenu de certains paramètres (par exemple, combinaison de cultures, encodage de sortie, etc.) .NET affichera le caractère infini Unicode ∞ (∞ / & # 8734;). L'émulateur de console / terminal Windows 10 affichera (encore une fois certains paramètres - voir capture d'écran ci-dessous) ce caractère Unicode sous la forme d'un 8.
Par exemple, sur Windows 10, avec les paramètres ci-dessous (notez la page de codes), il suffit de coller ∞ dans la console comme 8.
ÉDITER
Remerciements au commentaire de Chris : Il semble que la police de sortie en combinaison avec la page de codes soit responsable du problème ∞ => 8 sur la console. Comme lui, j'obtiens un affichage correct de ∞ dans toutes les polices TrueType que j'ai essayées et je ne vois 8 que lorsque les polices raster sont choisies.
la source
Le
8
symbole se produit lorsque Windows convertit Unicode en un encodage de caractères hérité. Puisqu'il n'y a pas de symbole infini dans le codage hérité, il utilise un "meilleur ajustement" à ce symbole, par défaut , qui dans ce cas est le numéro 8. Voir un exemple pour le codage "windows-1252" de Microsoft . Apparemment, Windows 10 utilise toujours les encodages de caractères hérités par défaut dans la console (voir «Pages de code» ).la source
Remarque: L'
.ToString()
appel de méthode implicite lors de l'écritureDouble.PositiveInfinity
sur la console est responsable de ce comportement.Appel
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));
renvoie la chaîne "Infinity"
tandis que le
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr")));
résultat est "+ Infini".Edit: Comme d'autres l'ont souligné dans les commets, ils ne peuvent pas confirmer entièrement mes résultats. En testant cela sur une machine différente, j'obtiens le personnage
∞
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 sortie8
.la source
Infinity
dans les deux. Quelle est la culture utilisée par votre application? VérifiezThread.CurrentThread.CurrentCulture
etThread.CurrentThread.CurrentUICulture
.8
dotnetfiddle.net/QYhXMu.ToString()
. En fin de compte,ToString()
retournera le.PositiveInfinitySymbol
de la pertinenteNumberFormatInfo
. Celles-ci semblent dépendre de la version du runtime et / ou de la version de Windows (ou quel que soit le système d'exploitation). Dans l'ancien temps, ceCultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
serait égal à"Infinity"
, mais avec les nouvelles versions du runtime et du système d'exploitation, c'est à la"∞"
place. Je viens de poser une question à ce sujet dans un commentaire à la réponse de Hans Passant dans ce fil.Code de repro:
La page de codes 1252 est un accident assez courant en Angleterre car il s'agit de la page de codes Windows par défaut. Comme c'est le cas pour l'Europe occidentale et les Amériques. Beaucoup de raisons pour changer la propriété par défaut Console.OutputEncoding par programme, de nombreux fichiers texte seront encodé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 d'après le jeu de caractères pris en charge par 1252, le symbole Infinity n'est pas disponible. Le codage doit donc proposer un substitut. Il s'agit souvent du
?
glyphe des points de code Unicode non pris en charge, la valeur de la propriété Encoding.EncoderFallback pour les encodages 8 bits. Mais pour 1252 et les anciennes pages de codes MS-Dos 850 et 858, le programmeur Microsoft a opté pour8
. Mec marrant.Le glyphe est pris en charge dans la page de codes habituelle des applications console sur une machine occidentale. Ce qui est 437, correspond à l'ancien jeu de caractères IBM . Avoir ce genre de désastres de codage est la raison pour laquelle Unicode a été inventé. Malheureusement, il est trop tard pour sauver les applications de la console, beaucoup trop de code qui reposait sur la page de codes MS-Dos par défaut.
La conversion de Double.PositiveInfinity en "∞" est spécifique à Win10. C'était "Infinity" dans les versions précédentes de Windows. Ces types de formats peuvent normalement être modifiés 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 \ Control Panel \ International), plutôt un gros oubli. Il s'agit de LOCALE_SPOSINFINITY dans le winapi natif. Dans un programme .NET, vous pouvez le remplacer par programme en clonant le CultureInfo et en modifiant sa propriété NumberFormatInfo.PositiveInfinitySymbol. Comme ça:
la source
ý
place de∞
. Cela m'a également montré que l'utilisation de polices non raster évitait le problème.CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
donne"Infinity"
ou"∞"
(ou autre chose)? Vous dites ci-dessus qu'il est spécifique à Windows 10, et je suis d'accord qu'il a été modifié à un moment donné. Mais si j'exécute une application sur Windows 8 avec «la même» version du .NET Framework , est-ce que j'obtiendrai un résultat différent de celui de Windows 10?$PSVersionTable
révèle que la version PS est quelque chose avec 5.1. Ce PowerShell cible le .NET Framework (CLR) version 4. * que je sais est nouveau sur cette machine. Toujours[cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
de Windows PowerShell donneInfinity
, non∞
(la culture actuelle esten-US
). Conclusion: c'est la version Windows qui décide, pas la version .NET."8" pour l'infini est affiché dans la console lors de l'exécution de .Net 4 et supérieur, sinon les versions précédentes affichent "Infinity".
Utilisation de Console.OutputEncoding = Encoding.Unicode; dans .Net 4 et au-dessus obtiendra l'infini pour s'afficher comme ∞, mais lèvera une IOException dans les versions précédentes.
REMARQUE: j'exécute Visual Studio 2015 Community Edition sur Windows 10 64 bits
la source