Windows 10 콘솔에서 무한대가 “8”로 인쇄되는 이유는 무엇입니까? 제로, 즉 포함한 부문에서 반환 무엇을 테스트하고

나는 제로, 즉 포함한 부문에서 반환 무엇을 테스트하고 0/1, 1/0하고 0/0. 이를 위해 다음과 비슷한 것을 사용했습니다.

Console.WriteLine(1d / 0d);

그러나이 코드는와 같은 문자열 상수를 인쇄 8하지 않습니다 .InfinityPositiveInfinity

완성을 위해 다음과 같은 모든 인쇄가 이루어집니다 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);

출력 :



답변

부동 소수점 값은 +Infinity0으로 부동 소수점 나누기 -Infinity의 분자 가 양수인 경우 , 0으로 부동 소수점 나누기 의 분자가 음수 인 NaN경우와 부동 소수점 나누기의 분자 및 분모가 모두 0 인 경우입니다. 그것은 C #이 사용 하는 IEEE754 부동 소수점 사양 에 있습니다.

귀하의 경우 콘솔 은 무한대 기호 (인쇄 상으로 가로 8-∞로 표시됨)를 세로 8로 변환합니다.


답변

특정 설정 (예 : 문화권, 출력 인코딩 등)이 지정된 경우 .NET은 유니 코드 무한대 문자 ∞ (∞ / & # 8734;)를 출력합니다. Windows 10 콘솔 / 터미널 에뮬레이터는 (특정 설정이 주어지면 아래 스크린 샷 참조)이 유니 코드 문자를 8로 표시합니다.

예를 들어, Windows 10에서 아래 설정 (코드 페이지 참고)을 사용하여 콘솔에 ∞를 붙여 넣기 만하면 8로 표시됩니다.

편집하다

Chris의 의견 덕분에 : 코드 페이지 와 함께 출력 글꼴 이 콘솔의 ∞ => 8 문제를 담당하는 것 같습니다 . 그와 같이 필자가 시도한 모든 트루 타입 글꼴에서 ∞가 올바르게 표시되고 래스터 글꼴이 선택되면 8 만 표시됩니다.


답변

8기호는 Windows가 유니 코드를 레거시 문자 인코딩으로 변환 할 때 발생합니다. 레거시 인코딩에는 무한대 기호가 없으므로 기본적으로 해당 기호에 “최적“를 사용합니다 .이 경우 숫자는 8입니다. Microsoft의 “windows-1252″인코딩에 대한 예를 참조하십시오 . 분명히 Windows 10은 여전히 콘솔에서 기본적으로 레거시 문자 인코딩을 사용합니다 ( “코드 페이지” 참조 ).


답변

참고 : 콘솔에 .ToString()쓸 때 암시 적 메서드 호출 Double.PositiveInfinity이이 동작을 담당합니다.

부름
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));

문자열 “무한대”결과

반면 Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr")));
“+ 인피니”결과.

편집 : 다른 사람들이 commets에서 지적했듯이 내 결과를 완전히 확인할 수는 없습니다. 다른 컴퓨터에서 이것을 테스트하면 두 통화에 대한 문자 를 얻습니다 .

의견 에 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 == 코드 페이지 변경) 을 입력하여 명령 줄에서 입력 하십시오.

1252에서 지원 하는 문자 집합 에서 알 수 있듯이 무한대 기호는 사용할 수 없습니다. 따라서 인코딩은 대체물을 제시해야합니다. 이는 ?지원되지 않는 유니 코드 코드 포인트 의 글리프 인 8 비트 인코딩의 Encoding.EncoderFallback 속성 값인 경우가 많습니다 . 그러나 1252 년과 레거시 MS-Dos 850 및 858 코드 페이지의 경우 Microsoft 프로그래머가로 결정했습니다 8. 재밌는 녀석.

글리프 서양 컴퓨터의 콘솔 앱에 대한 일반적인 코드 페이지에서 지원됩니다. 437 은 레거시 IBM 문자 세트와 일치합니다 . 이러한 종류의 인코딩 재해가 발생하면 유니 코드가 발명 된 것입니다. 슬프게도 콘솔 앱을 구하기에는 너무 늦었습니다. 너무 많은 코드가 기본 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();
    }
}

답변

.Net 4 이상을 실행할 때 콘솔에 무한대에 대한 “8”이 표시되고, 그렇지 않으면 이전 버전에 “무한대”가 표시됩니다.

Console.OutputEncoding 사용 = Encoding.Unicode; .Net 4 이상에서는 무한대가 ∞로 표시되지만 이전 버전에서는 IOException이 발생합니다.

참고 : Windows 10 64 비트에서 Visual Studio 2015 Community Edition을 실행하고 있습니다.