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.

Setting to reproduce

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.

font settings


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").

Tags:

Windows

C#

.Net