Windows 10コンソールで無限が「8」として印刷されるのはなぜですか?


146

私はゼロを含む部門から返されたもの0/1、すなわち、1/0およびをテストしていました0/0。これには、次のようなものを使用しました。

Console.WriteLine(1d / 0d);

ただし、このコードで8Infinity、次のような文字列定数は出力されません。PositiveInfinity

完全を期すために、以下のすべての印刷物8

Console.WriteLine(1d / 0d);

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

Console.WriteLine(Double.PositiveInfinity);

そしてConsole.WriteLine(Double.NegativeInfinity);プリント-8

なぜこの無限大は8を出力するのですか?


これが8ではなく無限大のシンボルであると思われる方のために、次のプログラム:

Console.WriteLine(1d / 0d);

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

Console.WriteLine(Double.PositiveInfinity);

Console.WriteLine(8);

出力:

イニフィニティ出力


69
あなたが見ることは無限のしるしです。90度
ひっくり返す

23
それが実際の8であり、90度回転した無限大の奇妙なUnicode文字ではないですか?これは、ロケールに応じて変わる可能性があります。dotnetfiddle.netで試してみましたが、印刷されましたInfinity
Kroltan 2016

4
@TheLethalCoder Sinatrが提案したことを行うか、の出力を印刷してくださいDouble.PositiveInfinity.ToString()[0] == '8'。一部のフォントでは、他の文字と非常によく似たエキゾチックな文字があります。また、コンピューターはどの言語に設定されていますか?
Kroltan 2016

15
これはWindows 10の問題のようです。Windows 8.1では、無限記号がありました。数日前にWindows 10にアップグレードしましたが、現在もを使用してい8ます(ドイツ語ロケール)。
ルネ・フォークト

13
簡単な確認は何が起こるかを確認することですConsole.Write("∞");
Jon Hanna

回答:


110

浮動小数点値は+Infinity、ゼロによる浮動小数点除算-Infinityの分子が正の場合、ゼロによる浮動小数点除算の分子が負のNaN場合、および浮動小数点除算の分子と分母の両方がゼロの場合に保証されます。これは、C#が使用するIEEE754浮動小数点仕様にあります。

あなたの場合、コンソールは無限大記号(​​これは、活字では水平8 —∞として表されることもあります)を垂直8に変換しています。


13
@TheLethalCoderそれはあなたのコンソールの写真なので、写真はこの答えを否定しません
Rob

9
@ロブ私は答えを読み間違えましたが、それは疑問を投げかけます、なぜそれを8に変換するのですか?そして、いくつかのフィドル/コンソールが文字列リテラルを
出力するのはなぜですか

1
これは私が無限大の記号(すなわち水平8)、私のコンソールは皆の間、8に変換する任意の理由があるが、使用すると思われる参照デバッガ用いた場合のようですInfinity、私はで答えからコードを使用する場合でも、または類似の文化を指定することによるSoren
TheLethalCoder

4
「lemniscate」と呼ばれています。これは、Unicode値を持っています∞
BlueRaja -ダニーPflughoeft

14
これが、バズライトイヤーが「To Eight And Beyond!」と言った理由をおそらく説明しています。PCでトイストーリーをプレイしたとき。;)
DeanOC

70

特定の設定(つまり、カルチャの組み合わせ、出力エンコーディングなど)を指定すると、.NETはUnicode無限大文字∞(∞/∞)を出力します。Windows 10のコンソール/ターミナルエミュレーターは(この場合も特定の設定-下のスクリーンショットを参照)、このUnicode文字を8として表示します。

たとえば、Windows 10では、以下の設定(コードページに注意)を使用して、∞をコンソールに貼り付けるだけで8と表示されます。

再現する設定

編集

Chrisのコメントに感謝します。コードページと組み合わせた出力フォント、コンソールの∞=> 8の問題の原因であるようです。彼と同様に、私が試したすべてのTrueTypeフォントで∞が適切に表示され、ラスターフォントが選択されている場合は8しか表示されません。

フォント設定


1
鉱山ではなく、実際に、その側に無限大記号を示して「8」私は「437(OEM -米国)」を使用していても、コンソールに貼り付けるとき
デレク・朕會功夫

3
特定の設定がこの表示の問題を引き起こす可能性があるという答えは正しいですが、後半は正しくありません。私のオプションは現在上記のものとまったく同じに見え、8ではなく正しい∞を取得します。フォントページに移動し、使用可能なフォントのリストから「ラスターフォント」を選択した場合にのみ、8を表示できます。Consolas、Courier New、その他はすべてうまく表示されているようです...
Chris

コードページが437のときにフォントをラスターに設定しても、シンボルは正しく表示されるため、これは間違いなく2つの要素の組み合わせです。両方の条件が満たされた場合にのみ、これは発生しているように見えます(少なくとも私にとって)。
Moshe Katz

39

この8記号は、WindowsがUnicodeをレガシー文字エンコーディングに変換するときに発生します。従来のエンコーディングには無限大の記号がないため、デフォルトではその記号に「最適」を使用します。この場合、数値は8です。Microsoftの「windows-1252」エンコーディングの例を参照してください。どうやら、Windows 10 はデフォルトでコンソールのレガシー文字エンコーディングを引き続き使用しています(「コードページ」を参照)。


11
「8」が意味的に非常に混乱しやすいのに、なぜ「8」が適切であると考えられるのでしょうか。コードページ437の他の文字は、度数記号やミル単位の記号(スラッシュの下に2つのoが付いた%)のように、より適切に見えます。どちらも実際の無限大の記号ほど優れているわけではありませんが、混乱を招く傾向は少ないようです。
スーパーキャット

「どうやら、Windows 10はコンソールでデフォルトで引き続きレガシー文字エンコーディングを使用しているようです」いいえ、私のWindows 10 cmd.exeでは、レガシーエンコーディングがデフォルトでオフになっています。
オービットのライトネスレース2016

これが私にとって最良の答えです。実際には、少なくともc:\ windows \ system32 \ c_1252.nlsファイルのWindows 10ボックスの位置0x2440に「8」文字が表示されます(無限は0x221Eで、ファイルにはオフセットを説明するヘッダーがいくつかあります) 。すべてのコードページエンコーディングには、対応する.nlsファイルがあります。デフォルトでは、コンソールは1252コードページを使用します(Windows 1252)。これらのマッピングが維持されないことに注意してください、このチェック:blogs.msdn.microsoft.com/shawnste/2007/09/24/...
サイモンMourier

35

注:.ToString()書き込み時の暗黙のメソッド呼び出しDouble.PositiveInfinityコンソールへのがこの動作の原因です。

呼び出す Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));

文字列「Infinity」になります

ながら Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr"))); 、「+ Infini」になります。

編集:他の人がコメットで指摘したように、彼らは私の結果を完全に確認することはできません。これを別のマシンでテストすると、キャラクターが表示されます、両方の呼び出しのがます。

コメントのvtortolaのおかげで、すべての文化の出力


(おそらく)答えを見つけました:

使用してConsole.OutputEncoding = Encoding.Unicode;、私はあなたがいくつかの文化のために経験している行動、例えば「RU」を再作成することができ、「RU-RU」は出力を生成します8


1
興味を持って私はあなたの例を試しました、そしてそれらは両方とも8を印刷します
TheLethalCoder

1
@TheLethalCoder私Infinityは両方に入る。アプリが実行しているカルチャーはどれですか?チェックThread.CurrentThread.CurrentCultureしてThread.CurrentThread.CurrentUICulture
vtortola 16


1
あなたは暗黙のうちに正しい.ToString()です。最後に、関連のToString()を返し.PositiveInfinitySymbolますNumberFormatInfo。これらは、ランタイムのバージョンやWindowsのバージョン(またはOS)に依存しているようです。昔CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolはと同じ"Infinity"でしたが、ランタイムとオペレーティングシステムの新しいバージョンでは、"∞"代わりにそれが使用されます。私はこのスレッドでのハンス・パッサントの回答へのコメントでそれについて尋ねました。
Jeppe Stig Nielsen、

16

再現コード:

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

コードページ1252は、デフォルトのWindowsコードページであるため、イギリスではよくある事故です。それは西ヨーロッパとアメリカ大陸のためです。デフォルトのConsole.OutputEncodingプロパティをプログラムで変更する多くの理由により、多くのテキストファイルが1252でエンコードされます。または、コマンドラインから次のように入力します。chcp 1252、プログラムを開始する前に(chcp ==コードページを変更)と。

からわかるように 1252でサポートされている文字セットに、Infinityシンボルは使用できません。したがって、エンコーディングは代替物を考え出す必要があります。これは?、サポートされていないUnicodeコードポイントのグリフであることが多く、8ビットエンコーディングのEncoding.EncoderFallbackプロパティ値です。しかし、1252、および従来のMS-Dos 850および858コードページについては、Microsoftプログラマーは8。おもしろい人。

グリフ 、Westernマシンのコンソールアプリの通常のコードページでサポートされています。これは437で、従来のIBM文字セット一致します。この種のエンコード障害が発生したため、Unicodeが発明されました。残念ながら、コンソールアプリを救うには遅すぎます。その周りのコードが多すぎて、デフォルトのMS-Dosコードページに依存していました。

Double.PositiveInfinityを "∞"に変換することは、Win10に固有です。以前のバージョンのWindowsでは「無限」でした。これらの種類の形式は、通常、コントロールパネル>言語>日付、時刻、または数値形式の変更>追加設定ボタンで変更できますが、ダイアログに無限記号の選択は含まれていません。また、レジストリ(HKCU \ Control Panel \ International)の対象外であり、大きな見落としがあります。ネイティブのwinapiではLOCALE_SPOSINFINITYです。.NETプログラムでは、CultureInfoを複製し、そのNumberFormatInfo.PositiveInfinitySymbolプロパティを変更することで、プログラムでオーバーライドできます。このような:

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

あなたのコードにより、WinXPがコードページ437を使用することを確認できました。これは、Windows 10 ýではの代わりに印刷されるようになりました。また、非ラスターフォントを使用すると問題が回避されることもわかりました。
Mark Hurd

それはかどうかを決定する.NETランタイムのバージョン、またはWindowsのバージョン(または任意のOS)、またはそれらの組み合わせ、あるCultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol与えます"Infinity""∞"(または他の何か)?Windows 10に固有であると上記で述べていますが、いつか変更されたと思います。しかし、Windows 8 で「同じ」バージョンの.NET Frameworkを使用してアプリケーションを実行すると、Windows 10とは異なる結果が得られますか?
Jeppe Stig Nielsen

この問題はWindowsで始まり、次に.NETの癖を明らかにします。Win8は依然として「インフィニティ」を支持
ハンス

1
確認しました!Windows Server 2012 R2マシン(Windows 8.1にほぼ対応)にログインしたところ、最新の.NET Frameworkがあり、最新のWindows PowerShellもあることがわかりました。PowerShellで$PSVersionTable、PSバージョンが5.1のものであることを明らかにします。そのPowerShellは、.NET Framework(CLR)バージョン4. *を対象としています。これは、そのマシンで新しく追加されたものです。それでも[cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolWindows PowerShellからではInfinityありません(現在のカルチャーはですen-US)。結論:.NETバージョンではなく、Windowsバージョンが決定します。
Jeppe Stig Nielsen

0

.Net 4以降を実行すると、コンソールに無限大の「8」が表示されます。それ以外の場合、以前のバージョンでは「無限大」と表示されます。

Console.OutputEncoding = Encoding.Unicode;を使用します。.Net 4以降では、∞として無限に表示されますが、以前のバージョンではIOExceptionがスローされます。

注:Windows 10 64ビットでVisual Studio 2015 Community Editionを実行しています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.