Windows 10 konsolunda sonsuzluk neden "8" olarak yazdırılıyor?


148

Sıfırlar dahil olmak üzere bölümden dönenleri test ediyordum 0/1, yani , 1/0ve 0/0. Bunun için aşağıdakine benzer bir şey kullandım:

Console.WriteLine(1d / 0d);

Ancak bu kod yazdırır 8değil Infinityya da benzeri başka bir dize sabiti PositiveInfinity.

Tamlık için aşağıdaki baskıların tümü 8:

Console.WriteLine(1d / 0d);

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

Console.WriteLine(Double.PositiveInfinity);

Ve Console.WriteLine(Double.NegativeInfinity);baskılar -8.

Bu sonsuzluk neden 8 yazdırır?


Bunun bir sekiz değil, sonsuzluk sembolü olduğunu düşünenler için aşağıdaki program:

Console.WriteLine(1d / 0d);

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

Console.WriteLine(Double.PositiveInfinity);

Console.WriteLine(8);

Çıktılar:

Inifinity çıktı


70
Gördüğünüz , sonsuzluğun işaretidir. görmek için 90 derece
çevirmeniz yeterli

23
Bunun gerçek 8, 90 derece döndürülmüş sonsuzluk için garip bir Unicode karakteri olmadığından emin misiniz ? Bu, bulunduğunuz yere göre değişebilir. Dotnetfiddle.net'te denedim ve yazdırdı Infinity.
Kroltan

4
@TheLethalCoder Lütfen Sinatr'ın önerdiğini yapın veya çıktısını yazdırın Double.PositiveInfinity.ToString()[0] == '8'. Bazı yazı tiplerinde diğerlerine çok benzeyen bazı egzotik karakterler var. Ayrıca, bilgisayarınız hangi dilde yapılandırıldı?
Kroltan

15
Bu bir Windows 10 sorunu gibi görünüyor. Windows 8.1'de bir sonsuzluk sembolüm vardı. Birkaç gün önce Windows 10'a yükseltildi ve şimdi benim de bir 8(almanca yerel ayarı) var.
René Vogt

13
Hızlı bir kontrol, ne olacağını görmek olacaktırConsole.Write("∞");
Jon Hanna

Yanıtlar:


112

Kayan nokta değerinin, +Infinitybir kayan noktanın sıfıra bölünmesinin -Infinitypayı pozitifse, bir kayan noktanın sıfıra bölünmesinin NaNpayı negatifse ve bir kayan nokta bölümünün pay ve paydasının her ikisinin de sıfır olması durumunda olduğundan emin olun. Bu , C # 'ın kullandığı IEEE754 kayan nokta belirtimindedir .

Sizin durumunuzda, konsol sonsuzluk sembolünü (bazen tipografik olarak yatay 8 - ∞ olarak temsil edilir) dikey 8'e dönüştürüyor.


13
@TheLethalCoder Konsolunuzun fotoğrafı olduğu için resim bu cevabı çürütmüyor
Rob

10
@Rob Cevabı yanlış okudum ama bu soruları akla getiriyor, neden 8'e çeviriyor? Ve neden bazı kemanlar / konsollar harf dizisini
basıyor

1
Bu, hata ayıklayıcıyı kullanırken bir sonsuzluk sembolü görüyorum (yani yatay 8), konsolumun 8'e dönüşmesinin herhangi bir nedeni var mı, diğerlerinin kullandığı Infinityveya benzer göründüğü halde yanıttaki kodu şu şekilde kullansam bile Soren, kültürü belirterek
TheLethalCoder

5
Buna "lemniscate" deniyor. Unicode değeri var: ∞
BlueRaja - Danny Pflughoeft

14
Bu muhtemelen Buzz Lightyear'ın neden "Sekiz ve Ötesine!" Dediğini açıklıyor. Bilgisayarımda Toy Story oynadığımda. ;)
DeanOC

71

Belirli ayarlar verildiğinde (yani kültürlerin kombinasyonu, çıktı kodlaması, vb.) .NET, Unicode sonsuz karakter ∞ (∞ / & # 8734;) çıktısını alacaktır. Windows 10 konsol / terminal emülatörü (yine belirli ayarlar verildiğinde - aşağıdaki ekran görüntüsüne bakın) bu Unicode karakterini 8 olarak görüntüleyecektir.

Örneğin, Windows 10'da, aşağıdaki ayarlarla (kod sayfasına dikkat edin), ∞'ı konsola yapıştırmanız 8 olarak gösterilir.

Yeniden üretme ayarı

DÜZENLE

Chris'in yorumuna teşekkürler : Görünüşe göre konsol üzerindeki ∞ => 8 sorunundan kod sayfası ile birlikte çıktı fontu sorumlu. Onun gibi, denediğim tüm TrueType yazı tiplerinde ∞ düzgün bir şekilde görüntülenmesini sağlıyorum ve sadece raster yazı tipleri seçildiğinde 8'i görüyorum.

yazı tipi ayarları


1
Benimki aslında konsola yapıştırıldığında "8" yerine sonsuzluk işaretini gösteriyor, ancak "437 (OEM - Amerika Birleşik Devletleri)" kullanıyorum
Derek 朕 會 功夫

3
Cevap doğru olsa da, bazı ayarlar bu ekran sorununa neden olabilir, ikinci yarı yanlıştır. Seçeneklerim şu anda yukarıdaki sizinkiyle tamamen aynı görünüyor ve 8 yerine doğru ∞ değerini alıyorum. Sadece yazı tipleri sayfasına gidip mevcut yazı tipleri listesinden "raster yazı tipleri" ni seçersem 8 göstermesini sağlayabilirim. Consolas, Courier New ve diğerlerinin hepsi iyi görünüyor ...
Chris

Bu kesinlikle iki faktörün bir birleşimidir, çünkü kod sayfası 437 olduğunda yazı tipini Raster olarak ayarlamak hala sembolü doğru şekilde gösterir. Sadece her iki koşul da karşılanırsa bu gerçekleşiyor gibi görünüyor (en azından benim için).
Moshe Katz

39

8Windows'un eski karakter kodlaması için Unicode dönüştürür zaman sembol ortaya çıkar. Eski kodlamada sonsuzluk sembolü olmadığından, varsayılan olarak bu sembole "en iyi uyumu" kullanır , bu durumda bu 8 sayısıdır. Microsoft'un "windows-1252" kodlaması için bir örneğe bakın . Görünüşe göre Windows 10 konsolda varsayılan olarak eski karakter kodlamalarını kullanmaya devam ediyor (bkz. "Kod Sayfaları" ).


12
Anlamsal olarak kafa karışıklığı yaratmaya bu kadar uygunken "8" in neden uygun olduğunu merak ediyorum? 437 kod sayfasındaki diğer karakterler, derece işareti veya binde-bir işareti (eğik çizginin altında iki o ile bir%) gibi daha uygun görünebilir. Bunların hiçbiri gerçek bir sonsuzluk işareti kadar iyi olmazdı, ancak kafa karışıklığına neden olmaya daha az eğilimli görünürler.
supercat

"Görünüşe göre, Windows 10 hala konsolda varsayılan olarak eski karakter kodlamalarını kullanıyor" Hayır, Windows 10 cmd.exe dosyamın eski kodlaması kutudan çıkarıldı.
Orbit'te Hafiflik Yarışları

Bu en iyi cevap IMHO. Aslında, c: \ windows \ system32 \ c_1252.nls dosyasında en azından Windows 10 kutumda 0x2440 konumunda '8' karakterini görebilirsiniz ( sonsuzluk 0x221E'dir ve dosyanın ofseti açıklayan bir başlığı vardır) . Tüm kod sayfası kodlamasının karşılık gelen bir .nls dosyası vardır. Varsayılan olarak, konsol 1252 kod sayfası kullanır (Windows 1252). Bu eşlemelerin korunmayacağını unutmayın, şunu kontrol edin: blogs.msdn.microsoft.com/shawnste/2007/09/24/…
Simon Mourier

35

Not: Bu davranıştan konsola .ToString()yazarken örtük yöntem çağrısı Double.PositiveInfinitysorumludur.

Aranıyor Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));

"Infinity" dizesiyle sonuçlanır

ise Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr"))); "+ Infini" sonuçları.

Düzenleme: Başkalarının kuyruklu yıldızlarda işaret ettiği gibi, sonuçlarımı tamamen doğrulayamazlar. Bunu farklı bir makinede test ederek , her iki arama için de karakteri alıyorum .

Yorumlarda vtortola sayesinde tüm kültürler için çıktı .


(Muhtemel) bir cevap buldum:

Console.OutputEncoding = Encoding.Unicode;I kullanarak , birkaç kültür için deneyimlediğiniz davranışı yeniden oluşturabilir, örneğin "ru", "ru-RU" çıktıyı üretir 8.



1
@TheLethalCoder İkisine Infinityde giriyorum . Uygulamanızın çalıştırdığı kültür hangisi? Kontrol edin Thread.CurrentThread.CurrentCultureve Thread.CurrentThread.CurrentUICulture.
vtortola

8
@ Søren D. Ptæus tbh 8 dotnetfiddle.net/QYhXMu
vtortola

1
Örtük konusunda haklısın .ToString(). Sonunda ilgili olanı ToString()iade edecektir . Bunlar, çalışma zamanının sürümüne ve / veya Windows sürümüne (veya işletim sistemi ne olursa olsun) bağlı görünüyor. Eski günlerde, eşit olurdu , ancak çalışma zamanının ve işletim sisteminin daha yeni sürümlerinde bunun yerine. Hans Passant'ın bu konudaki cevabına bir yorumda bunu sordum. .PositiveInfinitySymbolNumberFormatInfoCultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol"Infinity""∞"
Jeppe Stig Nielsen

16

Repro kodu:

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();
    }
}

Kod sayfası 1252, oradaki varsayılan Windows kod sayfası olduğu için İngiltere'de oldukça yaygın bir kazadır. Batı Avrupa ve Amerika için olduğu gibi. Varsayılan Console.OutputEncoding özelliğini programla değiştirmek için birçok neden, birçok metin dosyası 1252'de kodlanacaktır. Veya chcp 1252programı başlatmadan önce komut satırından (chcp == kod sayfasını değiştir) yazarak .

1252 tarafından desteklenen karakter setinden de anlayabileceğiniz gibi Sonsuzluk sembolü mevcut değil. Bu yüzden Kodlama bir ikame ile gelmelidir. Bu genellikle ?desteklenmeyen Unicode kod noktaları için glif, 8 bit kodlamalar için Encoding.EncoderFallback özellik değeridir. Ancak 1252 ve eski MS-Dos 850 ve 858 kod sayfaları için Microsoft programcısı karar verdi 8. Komik adam.

Glif , bir Western makinedeki konsol uygulamaları için normal kod sayfasında desteklenir. 437 olan eski IBM karakter kümesiyle eşleşir . Bu tür kodlama felaketlerine sahip olmak, Unicode'un icat edilmesinin nedenidir. Ne yazık ki konsol uygulamalarını kurtarmak için çok geç, varsayılan MS-Dos kod sayfasına dayanan çok fazla kod var.

Double.PositiveInfinity'nin "∞" 'a dönüştürülmesi Win10'a özgüdür. Önceki Windows sürümlerinde "Infinity" idi. Bu tür biçimler normalde Denetim Masası> Dil> Tarihi, saati veya sayı biçimlerini değiştir> Ek Ayarlar düğmesi ile değiştirilebilir ancak sonsuzluk sembolü seçimi iletişim kutusuna dahil edilmez. Ayrıca kayıt defteri tarafından kapsanmaz (HKCU \ Control Panel \ International), daha ziyade büyük bir gözetim. Yerel winapi'de LOCALE_SPOSINFINITY. Bir .NET programında, CultureInfo'yu klonlayarak ve NumberFormatInfo.PositiveInfinitySymbol özelliğini değiştirerek program aracılığıyla geçersiz kılabilirsiniz. Bunun gibi:

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();
    }
}

Kodunuz, WinXP'nin Windows 10'da artık ýbunun yerine yazdırılan 437 kod sayfasını kullandığını onaylamama izin verdi . Ayrıca, raster olmayan yazı tiplerini kullanmanın sorunu ortadan kaldırdığını da gösterdi.
Mark Hurd

O belirler .NET çalışma zamanı sürümü veya Windows (veya ne olursa olsun OS) veya bunların bir kombinasyonu sürümü mı CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolverir "Infinity"yoksa "∞"(veya başka bir şey)? Yukarıda bunun Windows 10'a özgü olduğunu söylüyorsunuz ve bir ara değiştirildiğine katılıyorum. Ancak Windows 8'de .NET Framework'ün "aynı" sürümüne sahip bir uygulama çalıştırırsam , Windows 10'dan farklı bir sonuç mu alacağım?
Jeppe Stig Nielsen

Bu sorun Windows ile başlar ve ardından .NET'te bir tuhaflık ortaya çıkarır. Win8 hala "Sonsuzluk" iyilik
Hans passant

1
Onaylanmış! Bir Windows Server 2012 R2 makinesinde yeni oturum açtım (kabaca Windows 8.1'e karşılık gelir) ve en yeni .NET Framework'e sahip olduğunu ve ayrıca en yeni Windows PowerShell'e sahip olduğunu biliyorum. PowerShell'de, $PSVersionTablePS sürümünün 5.1 ile bir şey olduğunu ortaya koyuyor. PowerShell, o makinede yeni olduğunu bildiğim .NET Framework (CLR) 4. * sürümünü hedefliyor. Yine [cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolde Windows PowerShell verir Infinity, vermez (mevcut kültür en-US). Sonuç: .NET sürümü değil, Windows sürümü karar verir.
Jeppe Stig Nielsen

0

.Net 4 ve üstü çalıştırılırken konsolda sonsuzluk için "8" görüntülenir, aksi takdirde önceki sürümler "Infinity" gösterir.

Console.OutputEncoding Kullanımı = Encoding.Unicode; Net 4 ve üzeri sürümlerde sonsuz sonsuza kadar ∞ olarak görüntülenecektir, ancak önceki sürümlerde bir IOException oluşturur.

NOT: Windows 10 64-bit üzerinde Visual Studio 2015 Community Edition çalıştırıyorum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.