Why is infinity printed as "8" in the Windows 10 console?
Note: The implicit .ToString()
method call when writing Double.PositiveInfinity
to console is responsible for this behavior.
Calling
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));
results in the string "Infinity"
while Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr")));
results in "+Infini".
Edit: As others have pointed out in the commets, they cannot entirely confirm my results. Testing this on a different machine, I get the character ∞
for both calls.
Output for all cultures, thanks to vtortola in the comments.
I found a (likely) answer:
Using Console.OutputEncoding = Encoding.Unicode;
I can recreate the behavior you are experiencing for several cultures, e.g. "ru", "ru-RU" produce the output 8
.
Given certain settings (i.e. combination of cultures, output encoding, etc.) .NET will output the Unicode infinity character ∞ (∞ / ∞). The Windows 10 console/terminal emulator will (again given certain settings - see screenshot below) display this Unicode character as an 8.
For example, on Windows 10, with the below settings (note the code page) simply pasting ∞ into the console shows as 8.
EDIT
With thanks to comment from Chris: It seems that the output font in combination with the code page is responsible for the ∞ => 8 issue on the console. Like him I get proper display of ∞ in all the TrueType fonts I have tried and only see 8 when raster fonts' is chosen.
Be assured that the floating point value is +Infinity
if the numerator of a floating point division by zero is positive, -Infinity
if the numerator of a floating point division by zero is negative, and NaN
if the numerator and denominator of a floating point division are both zero. That's in the IEEE754 floating point specification, which is what C# uses.
In your case, the console is converting the infinity symbol (which is sometimes represented typographically as a horizontal 8 — ∞) to a vertical 8.
The 8
symbol occurs when Windows converts Unicode to a legacy character encoding. Since there is no infinity symbol in the legacy encoding, it uses a "best fit" to that symbol, by default, which in this case is the number 8. See an example for Microsoft's "windows-1252" encoding. Apparently, Windows 10 still uses legacy character encodings by default in the console (see "Code Pages").