web-dev-qa-db-ja.com

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

ゼロを含む除算から返されたもの、つまり0/11/00/0をテストしていました。このために、次のようなものを使用しました。

Console.WriteLine(1d / 0d);

ただし、このコードは、InfinityPositiveInfinityなどの他の文字列定数ではなく、8を出力します。

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

Console.WriteLine(1d / 0d);

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

Console.WriteLine(Double.PositiveInfinity);

そして、Console.WriteLine(Double.NegativeInfinity);-8を出力します。

なぜこの無限大は8を印刷するのですか?


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

Console.WriteLine(1d / 0d);

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

Console.WriteLine(Double.PositiveInfinity);

Console.WriteLine(8);

出力:

Inifinity output

143
TheLethalCoder

ゼロによる浮動小数点除算の分子が正の場合、浮動小数点値は+Infinity、ゼロによる浮動小数点除算の分子が負の場合、-Infinity、浮動小数点除算の分子と分母の両方がNaNであることを確認してくださいゼロ。それは IEEE754浮動小数点仕様 にあり、これはC#が使用するものです。

あなたの場合、consoleは、無限記号(表記上、水平8-∞として表現されることもある)を垂直8に変換しています。

108
Bathsheba

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

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

Setting to reproduce

編集

Chris からのコメントに感謝します:出力フォントと組み合わせてコードページが∞= >コンソール上の8つの問題。彼のように、私が試したすべてのTrueTypeフォントで∞を適切に表示し、ラスターフォントが選択されたときに8だけが表示されます。

font settings

70
tolanj

8シンボルは、WindowsがUnicodeをレガシー文字エンコーディングに変換するときに発生します。レガシーエンコーディングには無限大記号がないため、 デフォルトではその記号に「ベストフィット」 を使用します。この場合は8です。 Microsoft'sの例を参照してください「windows-1252」エンコーディング 。どうやら、Windows 10stillはコンソールでデフォルトでレガシー文字エンコーディングを使用します( "Code Pages" を参照)。

38
Peter O.

注:Double.PositiveInfinityをコンソールに書き込むときの暗黙的な.ToString()メソッド呼び出しは、この動作を担当します。

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を生成します。

35

再現コード:

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 == change code page)と入力してコマンドラインからエンコードします。

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

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

Double.PositiveInfinityを「∞」に変換することは、Win10に固有です。以前のWindowsバージョンでは「Infinity」でした。これらの種類の形式は通常、[コントロールパネル]> [言語]> [日付、時刻、または数値の形式の変更]> [追加設定]ボタンで変更できますが、無限大記号の選択はダイアログに含まれません。また、レジストリ(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();
    }
}
15
Hans Passant

.Net 4以降を実行している場合、コンソールには無限の「8」が表示されます。

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

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

0
JTC