ゼロを含む除算から返されたもの、つまり0/1
、1/0
、0/0
をテストしていました。このために、次のようなものを使用しました。
Console.WriteLine(1d / 0d);
ただし、このコードは、Infinity
やPositiveInfinity
などの他の文字列定数ではなく、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);
出力:
ゼロによる浮動小数点除算の分子が正の場合、浮動小数点値は+Infinity
、ゼロによる浮動小数点除算の分子が負の場合、-Infinity
、浮動小数点除算の分子と分母の両方がNaN
であることを確認してくださいゼロ。それは IEEE754浮動小数点仕様 にあり、これはC#が使用するものです。
あなたの場合、consoleは、無限記号(表記上、水平8-∞として表現されることもある)を垂直8に変換しています。
特定の設定(つまり、カルチャの組み合わせ、出力エンコーディングなど)を指定すると、.NETはUnicode無限大文字∞(∞/∞)を出力します。 Windows 10コンソール/ターミナルエミュレーターは(特定の設定が与えられている-下のスクリーンショットを参照)このUnicode文字を8として表示します。
たとえば、Windows 10では、以下の設定(コードページに注意)で、コンソールに∞を貼り付けるだけで8と表示されます。
編集
Chris からのコメントに感謝します:出力フォントと組み合わせてコードページが∞= >コンソール上の8つの問題。彼のように、私が試したすべてのTrueTypeフォントで∞を適切に表示し、ラスターフォントが選択されたときに8だけが表示されます。
8
シンボルは、WindowsがUnicodeをレガシー文字エンコーディングに変換するときに発生します。レガシーエンコーディングには無限大記号がないため、 デフォルトではその記号に「ベストフィット」 を使用します。この場合は8です。 Microsoft'sの例を参照してください「windows-1252」エンコーディング 。どうやら、Windows 10stillはコンソールでデフォルトでレガシー文字エンコーディングを使用します( "Code Pages" を参照)。
注: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
を生成します。
再現コード:
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();
}
}
.Net 4以降を実行している場合、コンソールには無限の「8」が表示されます。
Console.OutputEncoding = Encoding.Unicodeを使用します。 .Net 4以降では、無限大になって無限大として表示されますが、以前のバージョンではIOExceptionがスローされます。
注:Windows 10 64ビットでVisual Studio 2015 Community Editionを実行しています