উইন্ডোজ 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
দেখেন অনন্তের চিহ্ন sign এটি দেখতে এটি 90 ডিগ্রি সরিয়ে ফেলুন 8
মোহিত শ্রীবাস্তব

23
আপনি কি নিশ্চিত যে এটি একটি আসল 8, অনন্যতার জন্য কিছু অদ্ভুত ইউনিকোড চরিত্র নয়, 90 ডিগ্রি ঘোরানো হয়েছে? এটি আপনার লোকেলের ভিত্তিতে পরিবর্তিত হতে পারে। আমি এটি ডটনেটফিডালটনে চেষ্টা করেছিলাম এবং এটি মুদ্রণ করে Infinity
Kroltan

4
@ দ্য লেথলকোডার দয়া করে সিনাটারের পরামর্শ মতো করুন, বা এর আউটপুট মুদ্রণ করুন Double.PositiveInfinity.ToString()[0] == '8'। কিছু বিদেশী চরিত্র রয়েছে যা কিছু ফন্টে অন্যের সাথে খুব মিল দেখায়। এছাড়াও, আপনার কম্পিউটারটি কোন ভাষাতে কনফিগার করা হয়েছে?
Kroltan

15
এটি উইন্ডোজ 10 সমস্যা বলে মনে হচ্ছে। উইন্ডোজ 8.1 এ আমার একটি অনন্ত প্রতীক ছিল। কিছু দিন আগে উইন্ডোজ 10 এ আপগ্রেড হয়েছে এবং এখন আমার কাছে একটি 8(জার্মান লোকাল) রয়েছে।
রেনে ভোগ

13
কী ঘটবে তা দেখার জন্য একটি দ্রুত চেক হবেConsole.Write("∞");
জন হান্না

উত্তর:


110

নিশ্চিত হোন যে ভাসমান পয়েন্টের মানটি +Infinityযদি শূন্য দ্বারা একটি ভাসমান পয়েন্ট বিভাগের -Infinityঅঙ্কটি ইতিবাচক হয়, যদি শূন্য দ্বারা একটি ভাসমান পয়েন্ট বিভাগের সংখ্যক negative NaNণাত্মক হয় এবং যদি একটি ভাসমান বিন্দু বিভাগের সংখ্যা এবং বিভাজন উভয়ই শূন্য হয়। এটি আইইইই 7575 ভাসমান পয়েন্ট স্পেসিফিকেশনে রয়েছে , যা সি # ব্যবহার করে।

আপনার ক্ষেত্রে, কনসোলটি অনন্ত প্রতীককে (যা কখনও কখনও অনুভূমিক 8 - as হিসাবে টাইপোগ্রাফিকভাবে উপস্থাপিত হয়) উল্লম্ব 8 এ রূপান্তর করে।


13
@TheLethalCoder ছবিটি এই উত্তরটিকে অস্বীকার করে না, কারণ এটি আপনার কনসোলের একটি ছবি
রব

9
@ রব আমি উত্তরটি ভুলভাবে পড়েছি, তবে এই প্রশ্নগুলি উত্থাপন করে কেন এটি এটিকে 8 এ রূপান্তর করে? এবং কেন কিছু ফিডল / কনসোল স্ট্রিং আক্ষরিক মুদ্রণ করে
TheLethalCoder

1
এটি আমি মনে করি ডিবাগারটি ব্যবহার করে আমি একটি অনন্ত প্রতীক (অর্থাৎ অনুভূমিক 8) ব্যবহার করে দেখছি, আমার কনসোলটি 8 এ রূপান্তরিত হবে এমন কোনও কারণ আছে যখন Infinityআমি উত্তর থেকে কোডটি ব্যবহার করি এমনকি যদি প্রত্যেকে ব্যবহার করে বা অনুরূপ বলে মনে হয় সংস্কৃতিটি নির্দিষ্ট করে সোরেন
TheLethalCoder

4
একে "লেমনিসিকেট" বলা হয়। এটির একটি ইউনিকোড মান রয়েছে: ∞
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

14
এটি সম্ভবত ব্যাখ্যা করে যে বাজ লাইটিয়ায়ার "টু এট অ্যান্ড বিন্ড!" যখন আমি আমার পিসিতে খেলনা গল্প খেলি। ;)
ডিনোক

70

নির্দিষ্ট সেটিংস দেওয়া হয়েছে (অর্থাত্ সংস্কৃতি, আউটপুট এনকোডিং ইত্যাদি সমন্বয়) N উইন্ডোজ 10 কনসোল / টার্মিনাল এমুলেটরটি (আবার কিছু নির্দিষ্ট সেটিংস দেওয়া হয়েছে - নীচের স্ক্রিনশটটি দেখুন) এই ইউনিকোড অক্ষরটিকে 8 হিসাবে প্রদর্শন করবে।

উদাহরণস্বরূপ, উইন্ডোজ 10 এ, নীচের সেটিংস সহ (কোড পৃষ্ঠাটি নোট করুন) কেবল the হিসাবে কনসোলে as পেস্ট করে।

পুনরুত্পাদন সেট

সম্পাদনা

ক্রিসের কাছ থেকে মন্তব্য করার জন্য ধন্যবাদ : দেখে মনে হচ্ছে কোড পাতার সাথে মিলিয়ে আউটপুট ফন্টটি কনসোলের ∞ => 8 ইস্যুটির জন্য দায়ী। তার মতো আমি আমি চেষ্টা করেছি এমন সমস্ত ট্রু টাইপ ফন্টে যথাযথ প্রদর্শন পেতে পারি এবং রাস্টার ফন্টগুলি বেছে নেওয়া হলে কেবল 8 টি দেখতে পাই।

হরফ সেটিংস


1
কনসোলে আটকানোর সময় খনিটি আসলে "8" এর পরিবর্তে অনন্ত চিহ্নটি দেখায়, যদিও আমি "437 (
ওএম

3
যদিও উত্তরটি ঠিক আছে যে নির্দিষ্ট সেটিংসের ফলে এই ডিসপ্লেটির দ্বিতীয়ার্ধটি ভুল হতে পারে। আমার বিকল্পগুলি বর্তমানে আপনার উপরের মতো দেখতে হুবহু এবং আমি একটি 8-এর পরিবর্তে সঠিক পেয়েছি get আমি কেবলমাত্র 8 টি দেখানোর জন্য এটি পেতে পারি যদি আমি ফন্টের পৃষ্ঠাতে যাই এবং উপলব্ধ ফন্টগুলির তালিকা থেকে "রাস্টার ফন্টগুলি" বেছে নিই। কনসোলস, কুরিয়ার নিউ এবং অন্যরা সকলেই এটিকে দুর্দান্ত দেখায় ...
ক্রিস

এটি অবশ্যই দুটি কারণের সংমিশ্রণ, কারণ কোডেপ ৪৩7 হলে রাস্টারটিতে ফন্ট সেট করা সঠিকভাবে প্রতীকটি দেখায়। উভয় শর্ত পূরণ হলেই কেবল এটি ঘটবে বলে মনে হচ্ছে (কমপক্ষে আমার জন্য)।
মোশে কাটজ

39

8প্রতীক ঘটে যখন উইন্ডোজ একটি লিগ্যাসি অক্ষর এনকোডিং করার ইউনিকোড পরিবর্তন করে। লিগ্যাসি এনকোডিংয়ে যেহেতু কোনও অনন্ত চিহ্ন নেই, তাই এটি ডিফল্টরূপে সেই প্রতীকটিতে একটি "সেরা ফিট" ব্যবহার করে , যা এই ক্ষেত্রে ৮ নম্বর Microsoft মাইক্রোসফ্টের "উইন্ডোজ -১২২২" এনকোডিংয়ের একটি উদাহরণ দেখুন । স্পষ্টতই, উইন্ডোজ 10 এখনও কনসোলে ডিফল্টরূপে উত্তরাধিকারী চরিত্রের এনকোডিংগুলি ব্যবহার করে ( "কোড পৃষ্ঠা" দেখুন )।


11
আমি ভাবছি কেন "8" কে একটি উপযুক্ত ফিট হিসাবে বিবেচনা করা হয়, যখন শব্দার্থগতভাবে বিভ্রান্তি তৈরি করার পক্ষে এটি যথাযথ? কোড পৃষ্ঠা 437 এর অন্যান্য অক্ষরগুলি আরও ভাল ফিট মনে হবে, যেমন ডিগ্রি চিহ্ন বা প্রতি-মিলের চিহ্ন (স্ল্যাশের নীচে দু'এর একটি%)। এগুলির উভয়ই প্রকৃত অনন্ত চিহ্ন হিসাবে তেমন ভাল হবে না, তবে তারা বিভ্রান্তির ঝুঁকি কম বলে মনে করবে না।
সুপারক্যাট

"স্পষ্টতই, উইন্ডোজ 10 এখনও কনসোলে ডিফল্টরূপে উত্তরাধিকারী চরিত্রের এনকোডিংগুলি ব্যবহার করে" না, আমার উইন্ডোজ 10 সেমিডি.এক্সিতে লিগ্যাসি এনকোডিংটি বাক্সের বাইরে বন্ধ রয়েছে।
লাইটনেস রেস

এটি সেরা উত্তর আইএমএইচও। আসলে, আপনি কমপক্ষে সি: \ উইন্ডোজ \ system32 \ c_1252.nls ফাইলের আমার উইন্ডোজ 10 বাক্সে 0x2440 পজিশনে '8' অক্ষরটি দেখতেও পাবেন ( অনন্ত 0x221E, এবং ফাইলে কিছুটা শিরোনাম রয়েছে যা অফসেটটি ব্যাখ্যা করে) । সমস্ত কোডপেজ এনকোডিংয়ে একটি সম্পর্কিত .nls ফাইল রয়েছে। ডিফল্টরূপে, কনসোলটি 1252 কোড পৃষ্ঠা (উইন্ডোজ 1252) ব্যবহার করে। নোট করুন যে এই ম্যাপিংগুলি রক্ষণাবেক্ষণ করা হবে না, এটি পরীক্ষা করুন: ব্লগস.এমএসএনএন.মাইক্রোসফট.
সাইমন মউরিয়ার

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

8
@ সেরেন ডি। পেটিস টিবিএইচ আমি কোনও সংস্কৃতি 8 ডটনেটফিডাল.net
কিওয়াইএইচএক্সএমউ

1
অন্তর্নিহিত সম্পর্কে আপনি ঠিক বলেছেন .ToString()। শেষ পর্যন্ত, প্রাসঙ্গিক ToString()ফেরত দেবে । এগুলি রানটাইমের সংস্করণ এবং / অথবা উইন্ডোজের সংস্করণ (বা যে কোনও ওএস) এর উপর নির্ভর করে বলে মনে হয়। পুরানো দিনগুলিতে, সমান হবে তবে রানটাইম এবং অপারেটিং সিস্টেমের নতুন সংস্করণগুলির সাথে এটি পরিবর্তে রয়েছে। আমি এই থ্রেডে হ্যান্স প্যাস্যান্টের উত্তরের মন্তব্যে এটি সম্পর্কে জিজ্ঞাসা করেছি। .PositiveInfinitySymbolNumberFormatInfoCultureInfo.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 এটি সেখানে ডিফল্ট উইন্ডোজ কোড পৃষ্ঠা হওয়ায় ইংল্যান্ডে একটি দুর্দান্ত সাধারণ দুর্ঘটনা। যেমনটি পশ্চিম ইউরোপ এবং আমেরিকার জন্য। ডিফল্ট কনসোল পরিবর্তন করার প্রচুর কারণ chcp 1252Oআউটপুট এনকোডিং বৈশিষ্ট্য প্রোগ্রাম হিসাবে, অনেক পাঠ্য ফাইল 1252 এ এনকোড করা হবে Or অথবা প্রোগ্রামটি শুরুর আগে কমান্ড লাইন থেকে (chcp == কোড পৃষ্ঠা পরিবর্তন করুন) টাইপ করে ।

আপনি 1252 দ্বারা সমর্থিত অক্ষর সেট থেকে বলতে পারেন যে , অনন্ত প্রতীকটি উপলভ্য নয়। সুতরাং এনকোডিং একটি বিকল্প সঙ্গে আসতে হবে। এটি প্রায়শই ?অসমর্থিত ইউনিকোড কোডপয়েন্টস, এনকোডিং E এনকোডারফ্যালব্যাক সম্পত্তি মূল্য 8-বিট এনকোডিংয়ের জন্য গ্লিফ is তবে 1252, এবং এমএস-ডস 850 এবং 858 কোড পৃষ্ঠাগুলির জন্য, মাইক্রোসফ্ট প্রোগ্রামার সিদ্ধান্ত নিয়েছে 8। মজার লোক.

গ্লিফের হয় পশ্চিমা মেশিনে কনসোল অ্যাপসের জন্য স্বাভাবিক কোড পৃষ্ঠা সমর্থিত। যা 437, আইটিএম চরিত্রের উত্তরাধিকারের সাথে মিলছে । এই ধরণের এনকোডিং বিপর্যয় হ'ল কেন ইউনিকোড আবিষ্কার হয়েছিল। দুর্ভাগ্যক্রমে কনসোল অ্যাপ্লিকেশনগুলি উদ্ধার করতে খুব দেরী হয়েছে, এর চারপাশে অনেক বেশি কোড যা ডিফল্ট এমএস-ডস কোড পৃষ্ঠায় নির্ভর করে।

Double.PositiveInfinity কে "∞" তে রূপান্তর করা Win10 এর সাথে নির্দিষ্ট। এটি পূর্ববর্তী উইন্ডোজ সংস্করণগুলিতে "ইনফিনিটি" হিসাবে ব্যবহৃত হত। এই ধরণের বিন্যাসগুলি সাধারণত কন্ট্রোল প্যানেল> ভাষা> পরিবর্তন তারিখ, সময়, বা সংখ্যা ফর্ম্যাট> অতিরিক্ত সেটিংস বোতামের সাহায্যে সংশোধন করা যেতে পারে তবে অনন্ত প্রতীক নির্বাচনটি সংলাপে অন্তর্ভুক্ত নয়। এছাড়াও রেজিস্ট্রি দ্বারা আবৃত নয় (HKCU Pan কন্ট্রোল প্যানেল by আন্তর্জাতিক), বরং একটি বড় পর্যবেক্ষণ। এটি স্থানীয় উইনাপিতে LOCALE_SPOSINFINITY ITY একটি নেট প্রোগ্রামে আপনি সংস্কৃতিআইফোন ক্লোন করে এবং এর নম্বর ফরম্যাটআইফোন.পসটিভ ইনফিনিটিসিম্বল সম্পত্তিটি পরিবর্তন করে প্রোগ্রামের ভিত্তিতে ওভাররাইড করতে পারেন। এটার মত:

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

আপনার কোডটি আমাকে উইনএক্সপি কোড পৃষ্ঠা 437 ব্যবহার করে তা নিশ্চিত করার অনুমতি দিয়েছে যা উইন্ডোজ 10 এ এখন ýপরিবর্তে প্রিন্ট করে । এটি আমাকে দেখিয়েছে যে নন-রাস্টার ফন্ট ব্যবহার করা সমস্যাটি এড়ায়।
মার্ক হার্ট

এটি .NET রানটাইমের সংস্করণ, বা উইন্ডোজের সংস্করণ (বা যাই হোক না কেন ওএস), বা একটি সংমিশ্রণ যা নির্ধারণ করে যে CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolদেয় "Infinity"বা "∞"(বা অন্য কিছু) দেয়? আপনি উপরে বলেছেন যে এটি উইন্ডোজ 10-এর সাথে সুনির্দিষ্ট, এবং আমি সম্মত হই যে এটি কোনও সময় পরিবর্তিত হয়েছিল। তবে আমি .NET ফ্রেমওয়ার্কের "একই" সংস্করণ সহ যদি উইন্ডোজ 8 এ একটি অ্যাপ্লিকেশন চালনা করি তবে আমি কি উইন্ডোজ 10 এর চেয়ে আলাদা ফলাফল পাব?
জেপ্প স্টিগ নীলসেন

এই সমস্যাটি উইন্ডোজ দিয়ে শুরু হয়, তারপরে .NET- এ একটি ছদ্মবেশ প্রকাশ করে। উইন 8 এখনও "ইনফিনিটি"
হ্যানস প্যাস্যান্ট

1
নিশ্চিত হয়েছে! আমি সবেমাত্র একটি উইন্ডোজ সার্ভার 2012 আর 2 মেশিনে লগইন করেছি (উইন্ডোজ 8.1 এর সাথে মোটামুটি অনুরূপ) এবং আমি জানি এটির মধ্যে নতুন .NET ফ্রেমওয়ার্ক রয়েছে এবং এটিতে নতুন উইন্ডোজ পাওয়ারশেলও রয়েছে। পাওয়ারশেলে, $PSVersionTableপিএস সংস্করণটি 5.1 সহ কিছু প্রকাশিত হয়েছে। এই পাওয়ারশেলটি। নেট ফ্রেমওয়ার্ক (সিএলআর) সংস্করণ 4 লক্ষ্য করে। * যা আমি জানি সেই মেশিনে নতুন। এখনও [cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolউইন্ডোজ পাওয়ারশেল থেকে দেয় Infinity, না (বর্তমান সংস্কৃতিটি en-US)। উপসংহার: উইন্ডোজ সংস্করণ সিদ্ধান্ত নেয়, নেট সংস্করণ নয়।
জেপ্প স্টিগ নীলসেন

0

অনন্তর জন্য "8" চলমান অবস্থায় কনসোলে প্রদর্শিত হয় et 4 এবং উপরে নেট, অন্যথায় পূর্ববর্তী সংস্করণগুলি "ইনফিনিটি" প্রদর্শন করে।

কনসোল ব্যবহার করে.আউটপুটইনকোডিং = এনকোডিং.উনিকোড; নেট। 4 এবং উপরেরটি ∞ হিসাবে প্রদর্শন করার জন্য অসীমতা পাবে, তবে পূর্ববর্তী সংস্করণগুলিতে একটি আইওএক্সেপশন নিক্ষেপ করবে।

দ্রষ্টব্য: আমি উইন্ডোজ 10 64-বিটে ভিজ্যুয়াল স্টুডিও 2015 এর সম্প্রদায় সংস্করণটি চালাচ্ছি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.