विंडोज 10 कंसोल में अनंत को "8" के रूप में क्यों मुद्रित किया गया है?


146

मैं परीक्षण कर रहा था कि जीरो सहित डिवीजन से क्या लौटा गया था 0/1, 1/0और 0/0। इसके लिए मैंने निम्नलिखित के समान कुछ का उपयोग किया:

Console.WriteLine(1d / 0d);

हालांकि यह कोड प्रिंट या कुछ अन्य स्ट्रिंग की तरह प्रिंट 8नहीं Infinityकरता है PositiveInfinity

निम्नलिखित सभी प्रिंटों की पूर्णता के लिए 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);

आउटपुट:

इनफिनिटी आउटपुट


69
आप देखिए अनंत का संकेत है। बस इसे देखने के लिए इसे 90 डिग्री पर फ्लिप करें 8
मोहित श्रीवास्तव

23
क्या आपको यकीन है कि यह एक वास्तविक 8नहीं, अनजान के लिए कुछ अजीब यूनिकोड चरित्र है, 90 डिग्री घुमाया गया है? यह आपके स्थान के आधार पर बदल सकता है। मैंने इसे dotnetfiddle.net पर आज़माया और यह प्रिंट करता है Infinity
क्रोल्टन

4
@ TheLethalCoder कृपया वही करें जो Sinatr ने सुझाया है, या इसका आउटपुट प्रिंट करें Double.PositiveInfinity.ToString()[0] == '8'। कुछ विदेशी चरित्र हैं जो कुछ फोंट में दूसरों के समान दिखते हैं। इसके अलावा, आपके कंप्यूटर को किस भाषा में कॉन्फ़िगर किया गया है?
क्रोल्टन

15
यह विंडोज 10 की समस्या लगती है। विंडोज 8.1 में मेरे पास एक अनंत प्रतीक था। कुछ दिनों पहले अपग्रेड किया गया विंडोज 10 और अब मेरे पास एक 8(भी जर्मन लोकेल) है।
रेने वोग

13
एक त्वरित जांच को देखने के लिए कि क्या होता है हो सकता हैConsole.Write("∞");
जॉन हैना

जवाबों:


110

आश्वस्त रहें कि फ्लोटिंग पॉइंट वैल्यू +Infinityयदि शून्य -Infinityसे एक फ्लोटिंग पॉइंट डिवीजन का अंश धनात्मक है, यदि फ्लोटिंग पॉइंट डिवीजन NaNका न्यूमेरियर ऋणात्मक है, और यदि फ्लोटिंग पॉइंट डिवीजन का न्यूमेरिक और भाजक दोनों शून्य हैं। वह IEEE754 फ्लोटिंग पॉइंट स्पेसिफिकेशन में है , जो कि C # का उपयोग करता है।

आपके मामले में, कंसोल अनंत प्रतीक को परिवर्तित कर रहा है (जिसे कभी-कभी एक क्षैतिज 8 - vertical) के रूप में एक ऊर्ध्वाधर 8 के रूप में दर्शाया जाता है।


13
@TheLethalCoder चित्र इस उत्तर का खंडन नहीं करता है, क्योंकि यह अपने कंसोल की एक तस्वीर है
रोब

9
@ रब ने उत्तर को गलत बताया है, हालांकि जो सवाल पूछता है, वह इसे 8 में क्यों बदल देता है? और कुछ फिडल्स / कन्सोल स्ट्रिंग शाब्दिक क्यों
छापते हैं

1
यह डिबगर का उपयोग करके ऐसा प्रतीत होता है कि मुझे एक अनन्तता का प्रतीक (अर्थात क्षैतिज 8) दिखाई देता है, क्या कोई कारण है कि मेरा कंसोल 8 में परिवर्तित हो जाएगा जबकि बाकी सभी का उपयोग करना Infinityया समान प्रतीत होता है, भले ही मैं उत्तर से कोड का उपयोग करता हूं सोरेन संस्कृति को निर्दिष्ट करके
TheLethalCoder

4
इसे एक "लेम्निस्केट" कहा जाता है। इसका एक यूनिकोड मान है: a
ब्लूराजा - डैनी पफ्लुगुएफ्ट

14
यह शायद समझाता है कि बज़ लाइटियर क्यों कहता है "टू ईट एंड बियॉन्ड!" जब मैं अपने पीसी पर टॉय स्टोरी खेलता हूं। ;)
डीनॉक

70

कुछ सेटिंग्स (अर्थात संस्कृतियों का संयोजन, आउटपुट एन्कोडिंग, आदि) को देखते हुए .NET यूनिकोड इन्फिनिटी कैरेक्टर ∞ (87 / & # 8734;) को आउटपुट करेगा। विंडोज 10 कंसोल / टर्मिनल एमुलेटर (फिर से दिए गए कुछ सेटिंग्स - नीचे स्क्रीनशॉट देखें) इस यूनिकोड चरित्र को 8 के रूप में प्रदर्शित करेगा।

उदाहरण के लिए, विंडोज 10 पर, नीचे सेटिंग्स के साथ (कोड पृष्ठ पर ध्यान दें) केवल कंसोल में ∞ को चिपकाने के रूप में 8 दिखाता है।

प्रजनन करने की सेटिंग

संपादित करें

क्रिस की टिप्पणी के लिए धन्यवाद के साथ : ऐसा लगता है कि कोड पृष्ठ के संयोजन में आउटपुट फ़ॉन्ट कंसोल पर> => 8 अंक के लिए जिम्मेदार है। उसकी तरह मुझे मेरे द्वारा आजमाए गए सभी ट्रू टाइप फोंट में him का उचित प्रदर्शन मिलता है और केवल 8 देखते हैं जब रैस्टर फोंट चुना जाता है।

फ़ॉन्ट सेटिंग्स


1
मेरा वास्तव में कंसोल में चिपकाए जाने पर "8" के बजाय अपनी तरफ से अनंतता का संकेत दिखाता है, हालांकि मैं "437 (ओईएम - संयुक्त राज्य अमेरिका)" का उपयोग कर रहा हूं
डेरेक 會 功夫 '

3
हालांकि यह उत्तर सही है कि कुछ सेटिंग्स इस प्रदर्शन को जारी कर सकती हैं क्योंकि दूसरी छमाही गलत है। मेरे विकल्प वर्तमान में बिल्कुल आपके जैसे ही दिखते हैं और मुझे 8. के ​​बजाय सही the मिलते हैं। मैं इसे केवल एक 8 दिखाने के लिए प्राप्त कर सकता हूं यदि मैं फोंट पेज पर जाता हूं और उपलब्ध फोंट की सूची में से "रैस्टर फोंट" चुनता हूं। कॉन्सोल, कूरियर न्यू और अन्य सभी इसे ठीक प्रदर्शित करते हैं ...
क्रिस

यह निश्चित रूप से दो कारकों का एक संयोजन है, क्योंकि कोडपेज 437 होने पर रैस्टर को फ़ॉन्ट सेट करना अभी भी प्रतीक को सही ढंग से दिखाता है। यदि दोनों शर्तें पूरी होती हैं तो ही ऐसा लगता है (कम से कम मेरे लिए)।
मोशे काटज़

39

8प्रतीक तब होता है जब विंडोज एक विरासत वर्ण एन्कोडिंग को यूनिकोड में कनवर्ट करता है। चूंकि विरासत एन्कोडिंग में कोई अनन्तता का प्रतीक नहीं है, इसलिए यह डिफ़ॉल्ट रूप से उस प्रतीक के लिए "सबसे अच्छा फिट" का उपयोग करता है , जो इस मामले में नंबर 8 है। माइक्रोसॉफ्ट के "विंडोज़ -1252" एन्कोडिंग के लिए एक उदाहरण देखें । जाहिर है, विंडोज 10 अभी भी कंसोल में डिफ़ॉल्ट रूप से विरासत चरित्र एन्कोडिंग का उपयोग करता है ( "कोड पृष्ठ" देखें )।


11
मुझे आश्चर्य है कि "8" को एक अच्छा फिट क्यों माना जाता है, जब यह भ्रम पैदा करने के लिए शब्दार्थ है? कोड पृष्ठ 437 में अन्य वर्ण डिग्री के चिह्न या प्रति-मील चिह्न (स्लैश के नीचे दो ओ के साथ एक%) की तरह एक बेहतर फिट प्रतीत होंगे। दोनों में से कोई भी वास्तविक इन्फिनिटी संकेत के रूप में अच्छा नहीं होगा, लेकिन वे भ्रम पैदा करने के लिए कम प्रवण प्रतीत होंगे।
सुपरकैट

"जाहिर है, विंडोज 10 अभी भी कंसोल में डिफ़ॉल्ट रूप से विरासत चरित्र एन्कोडिंग का उपयोग करता है" नहींं, मेरे विंडोज 10 cmd.exe में विरासत एन्कोडिंग बॉक्स से बाहर हो गई है।
ऑर्बिट

यह सबसे अच्छा जवाब है IMHO। वास्तव में, आप 0x2440 की स्थिति में '8' वर्ण को कम से कम मेरे विंडोज 10 बॉक्स में c: \ windows \ system32 \ c_1252.nls फ़ाइल में देख सकते हैं ( अनंत 0x221E है, और फ़ाइल कुछ हेडर है जो ऑफसेट की व्याख्या करता है) । सभी कोडपेज एन्कोडिंग में एक .nls फ़ाइल है। डिफ़ॉल्ट रूप से, कंसोल 1252 कोड पेज (विंडोज 1252) का उपयोग करता है। ध्यान दें कि इन मैपिंग को बनाए नहीं रखा जाएगा, इसे देखें: blogs.msdn.microsoft.com/shawnste/2007/09/24/…
साइमन

35

नोट: कंसोल पर .ToString()लिखते समय निहित विधि कॉल Double.PositiveInfinityइस व्यवहार के लिए जिम्मेदार है।

कॉलिंग Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));

"इन्फिनिटी" स्ट्रिंग में परिणाम

जबकि Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr"))); परिणाम "+ Infini"।

संपादित करें: जैसा कि अन्य लोगों ने धूमकेतु में बताया है, वे मेरे परिणामों की पूरी तरह से पुष्टि नहीं कर सकते। एक अलग मशीन पर यह परीक्षण, मुझे दोनों कॉल के लिए चरित्र मिलता है ।

सभी संस्कृतियों के लिए आउटपुट , टिप्पणियों में vtortola के लिए धन्यवाद ।


मुझे एक (संभावना) उत्तर मिला:

Console.OutputEncoding = Encoding.Unicode;मेरे द्वारा उपयोग किए गए व्यवहार को आप कई संस्कृतियों के लिए फिर से बना सकते हैं, उदाहरण के लिए "आरयू", "आरयू-आरयू" आउटपुट का उत्पादन करते हैं 8


1
रुचि से बाहर मैंने आपके उदाहरणों की कोशिश की और वे दोनों 8
TheLethalCoder

1
@ लेथलॉकर मुझे Infinityदोनों में मिलता है। आपका ऐप कौन सा कल्चर चला रहा है? जाँच करें Thread.CurrentThread.CurrentCultureऔर Thread.CurrentThread.CurrentUICulture
vtortola 10

8
@ सोरेन डी Ptæus tbh मैं किसी भी संस्कृति एक पैदा नहीं देख सकते हैं 8 dotnetfiddle.net/QYhXMu
vtortola

1
आप निहितार्थ के बारे में सही हैं .ToString()। अंत में, ToString()वापस आ जाएगी .PositiveInfinitySymbolप्रासंगिक की NumberFormatInfo। ये रनटाइम के संस्करण और / या विंडोज (या जो भी ओएस) के संस्करण पर निर्भर करते हैं। पुराने दिनों में, CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolइसके बराबर होगा "Infinity", लेकिन रनटाइम और ऑपरेटिंग सिस्टम के नए संस्करणों के "∞"बजाय यह है । मैंने इसके बारे में हंस थैंक्स के जवाब में थ्रेड के जवाब में ही पूछा।
जेपी स्टिग नीलसन

16

रेप्रो कोड:

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 इंग्लैंड में एक बहुत ही सामान्य दुर्घटना है क्योंकि यह डिफ़ॉल्ट विंडोज कोड पृष्ठ है। जैसा कि यह पश्चिमी यूरोप और अमेरिका के लिए है। डिफ़ॉल्ट रूप से परिवर्तित करने के लिए बहुत सारे कारण। Conut.OutputEncoding संपत्ति को प्रोग्रामेटिक रूप से, कई पाठ फ़ाइलों को 1252 में इनकोड किया जाएगा। या कमांड लाइन से टाइप करकेchcp 1252 प्रोग्राम शुरू करने से पहले (chcp == परिवर्तन कोड पेज)।

जैसा कि आप 1252 द्वारा समर्थित चरित्र सेट से बता सकते हैं , इन्फिनिटी प्रतीक उपलब्ध नहीं है। इसलिए एनकोडिंग को एक विकल्प के साथ आना होगा। यह अक्सर ?असमर्थित यूनिकोड कोडपॉइंट्स के लिए ग्लिफ़ है, 8-बिट एनकोडिंग्स के लिए एन्कोडिंग .EncoderFallback गुण मान। लेकिन 1252 के लिए, और विरासत MS-Dos 850 और 858 कोड पृष्ठों के लिए, Microsoft प्रोग्रामर ने निर्णय लिया8 । मजाकिया बन्दा।

एक पश्चिमी मशीन पर कंसोल ऐप्स के लिए सामान्य कोड पृष्ठ में ग्लिफ़ का समर्थन किया जाता है । जो 437 है, विरासत आईबीएम चरित्र सेट से मेल खाता है । इस तरह की एन्कोडिंग आपदाओं के बाद यूनिकोड का आविष्कार किया गया था। कंसोल एप्लिकेशन को बचाने के लिए बहुत देर हो चुकी है, डिफ़ॉल्ट MS-Dos कोड पृष्ठ पर निर्भर बहुत दूर कोड।

DoublePositiveInfinity को "is" में परिवर्तित करने से Win10 के लिए विशिष्ट है। यह पिछले विंडोज संस्करणों में "इन्फिनिटी" हुआ करता था। इस तरह के फॉर्मेट को आमतौर पर कंट्रोल पैनल> लैंग्वेज> चेंज डेट, टाइम या नंबर फॉर्मेट> एडिशनल सेटिंग बटन के साथ मॉडिफाई किया जा सकता है लेकिन इनफिनिटी सिंबल का चयन डायलॉग में शामिल नहीं है। रजिस्ट्री (HKCU \ Control Panel \ International) द्वारा कवर नहीं किया गया, बल्कि एक बड़ा निरीक्षण किया गया। यह देशी winapi में LOCALE_SPOSINFINITY है। एक .NET प्रोग्राम में आप इसे कल्चरइन्फो से क्लोन करके और इसके नंबरफ़ॉर्मेटइन्फो.पोसिवइन्फिनिटीसिमबोल प्रॉपर्टी को बदलकर प्रोग्रामेटिक रूप से ओवरराइड कर सकते हैं। ऐशे ही:

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

आपके कोड ने मुझे पुष्टि करने की अनुमति दी कि WinXP कोड पृष्ठ 437 का उपयोग करता है, जो कि विंडोज 10 में, अब ýइसके बजाय प्रिंट करता है । इसने मुझे यह भी दिखाया कि गैर-फास्टर फोंट का उपयोग करने से समस्या से बचा जाता है।
मार्क हर्ड

यह .NET रनटाइम के संस्करण या Windows (या जो भी ओएस), या एक संयोजन के संस्करण, कि निर्धारित करता है कि है CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolदेता है "Infinity"या "∞"(या कुछ और)? आप ऊपर कहते हैं कि यह विंडोज 10 के लिए विशिष्ट है, और मैं मानता हूं कि इसे किसी समय में बदल दिया गया था। लेकिन अगर मैं .NET फ्रेमवर्क के "समान" संस्करण के साथ विंडोज 8 पर एक एप्लिकेशन चलाता हूं , तो क्या मुझे विंडोज 10 के साथ एक अलग परिणाम मिलेगा?
जेपी स्टिग नीलसन

यह समस्या विंडोज़ से शुरू होती है, फिर .NET में एक क्विकॉर को उजागर करती है। Win8 अभी भी "इन्फिनिटी" का पक्षधर है
हंस पैसेंट

1
की पुष्टि! मैंने अभी एक Windows Server 2012 R2 मशीन में लॉग इन किया है (लगभग 8.1 विंडोज से मेल खाती है), और मुझे पता है कि इसमें सबसे नया .NET फ्रेमवर्क है, और इसमें सबसे नया Windows PowerShell भी है। PowerShell में, $PSVersionTablePS संस्करण का पता चलता है 5.1 के साथ कुछ है। यह PowerShell .NET फ्रेमवर्क (CLR) संस्करण 4 को लक्षित करता है। * जो मुझे पता है कि उस मशीन पर नया है। फिर भी [cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolविंडोज पॉवरशेल से Infinity, नहीं (वर्तमान संस्कृति है en-US)। निष्कर्ष: विंडोज़ संस्करण तय करता है, न कि .NET संस्करण।
जेपी स्टिग नीलसन

0

अनन्तता के लिए "8" को सांत्वना में प्रदर्शित किया जाता है जब रनिंग .नेट 4 और इसके बाद के संस्करण, अन्यथा पिछले संस्करण "इन्फिनिटी" प्रदर्शित करते हैं।

Console.OutputEncoding = Encoding.Unicode का उपयोग करना; .Net 4 और उसके बाद के संस्करण में to के रूप में प्रदर्शित करने के लिए अनंत मिलेगा, लेकिन पिछले संस्करणों में एक IOException फेंकता है।

नोट: मैं विंडोज 10 64-बिट पर विजुअल स्टूडियो 2015 कम्युनिटी एडिशन चला रहा हूं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.