চেক না করা uint এর জন্য সি # ওভারফ্লো আচরণ


10

আমি এই কোডটি https://dotnetfiddle.net/ এ পরীক্ষা করছি :

using System;

public class Program
{
    const float scale = 64 * 1024;

    public static void Main()
    {
        Console.WriteLine(unchecked((uint)(ulong)(1.2 * scale * scale + 1.5 * scale)));
        Console.WriteLine(unchecked((uint)(ulong)(scale* scale + 7)));
    }
}

যদি আমি .NET 4.7.2 দিয়ে কম্পাইল করি তবে আমি পাই

859091763

7

তবে আমি যদি রোজলিন বা। নেট কোর করি, আমি পাই

859091763

0

কেন এমন হয়?


ulongপরবর্তী ক্ষেত্রে কাস্ট করা উপেক্ষা করা হচ্ছে তাই এটি float-> intরূপান্তরকরণে ঘটে ।
মাদ্রিফ্লেশন

আচরণের পরিবর্তন দেখে আমি আরও অবাক হয়েছি, মনে হচ্ছে এটি বেশ বড় পার্থক্যের মতো। "0" ক্যাসেটের এই চেইন টিবিএইচ দিয়ে কোনও বৈধ উত্তর বলে আশা করব না।
লুকাস

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

এটি আকর্ষণীয়, ডটনেটফিডেলের সাথে আপনার উদাহরণ সহ, রাইলাইন 3.4 এবং 7 এ শেষ রাইন্ডলাইন 0 আউটপুট দেয় N নেট কোর 3.1
লুকাশ

আমি আমার ডেস্কটপেও নিশ্চিত করেছিলাম। জেআইটি কোড এমনকি একেবারে ঘনিষ্ঠভাবে দেখায় না, আমি। নেট কোর এবং। নেট ফ্রেমওয়ার্কের মধ্যে বিভিন্ন ফলাফল পাই। ট্রিপ্পি
লুকাস

উত্তর:


1

আমার সিদ্ধান্তগুলি ভুল ছিল। আরও বিশদের জন্য আপডেটটি দেখুন।

আপনার ব্যবহৃত প্রথম সংকলকটিতে বাগের মতো মনে হচ্ছে। জিরো এই ক্ষেত্রে সঠিক ফলাফলসি # স্পেসিফিকেশন দ্বারা নির্ধারিত ক্রিয়াকলাপগুলির ক্রম নিম্নরূপ:

  1. ফলন দিয়ে গুন scaleকরাscalea
  2. সঞ্চালন a + 7, ফলনb
  3. নিক্ষেপ bকরার ulong, ফলনশীলc
  4. নিক্ষেপ cকরার uint, ফলনশীলd

প্রথম দুটি ক্রিয়াকলাপ আপনাকে ভাসমান মূল্যের সাথে ছেড়ে যায় b = 4.2949673E+09f। মান ভাসমান-পয়েন্ট পাটিগণিতের অধীনে, এটি 4294967296( আপনি এটি এখানে পরীক্ষা করতে পারেন )। মধ্যে ফিট করে ulongশুধু জরিমানা, তাই c = 4294967296, তবে এতে ঠিক এক তুলনায় আরো uint.MaxValue, তাই এটি রাউন্ড-ভ্রমণের 0, অত d = 0। এখন, বিস্ময় বিস্ময়, যেহেতু ফ্লোটিং পয়েন্ট গাণিতিক ভীতু হয়, 4.2949673E+09fএবং 4.2949673E+09f + 7আইইইই 754. মধ্যে সঠিক একই সংখ্যা তাই scale * scaleআপনি যদি একটি একই মান দিতে হবে floatযেমন scale * scale + 7, a = b, তাই দ্বিতীয় অপারেশন মূলত একটি নো-অপ হয়।

রোজলিন সংকলক সংকলন সময়ে (কিছু) কনস্ট ক্রিয়াকলাপ সম্পাদন করে এবং এতে সম্পূর্ণ প্রকাশটি অনুকূল করে তোলে 0আবার, এটি সঠিক ফলাফল এবং সংকলকটিকে এমন কোনও অপটিমাইজেশন সম্পাদনের অনুমতি দেওয়া হয়েছে যা সেগুলি ছাড়াই কোডের মতো হুবহু আচরণ করবে।

আমার অনুমান যে আপনি .NET 4.7.2 সংকলকটি ব্যবহার করেছেন এটি এটিকে অপ্টিমাইজ করার চেষ্টাও করে, তবে একটি বাগ রয়েছে যা এটি ভুল জায়গায় কাস্টের মূল্যায়ন করার কারণ করে। স্বাভাবিকভাবে, আপনি যদি প্রথম নিক্ষেপ scaleএকটি থেকে uintএবং তারপর অপারেশন সঞ্চালন, আপনি পেতে 7, কারণ scale * scaleবৃত্তাকার-ভ্রমণের 0এবং তারপর আপনি যোগ 7। তবে রানটাইমে ধাপে ধাপে অভিব্যক্তিগুলি মূল্যায়নের সময় আপনি যে ফলাফলটি পেয়ে যাবেন তার সাথে এটি বেমানান । আবার, উত্পাদিত আচরণের দিকে তাকানোর সময় মূল কারণটি কেবলমাত্র একটি অনুমান, তবে উপরে আমি যা কিছু বলেছি তা দিয়ে আমি নিশ্চিত হয়েছি যে এটি প্রথম সংকলকটির পাশের একটি নির্দিষ্ট লঙ্ঘন।

হালনাগাদ:

আমি একটি বোকা কাজ করেছি। আছে C # এর স্পেসিফিকেশন-এর এই বিট যে আমি যখন উপরে উত্তর লেখার অস্তিত্ব জানতেন না:

ফ্লোটিং-পয়েন্ট অপারেশনগুলি অপারেশনের ফলাফলের ধরণের চেয়ে উচ্চতর নির্ভুলতার সাথে সঞ্চালিত হতে পারে। উদাহরণস্বরূপ, কিছু হার্ডওয়্যার আর্কিটেকচারগুলি "প্রসারিত" বা "লম্বা ডাবল" ভাসমান-বিন্দু প্রকারকে দ্বিগুণ প্রকারের চেয়ে বৃহত্তর পরিসীমা এবং নির্ভুলতার সাথে সমর্থন করে এবং স্পষ্টত এই উচ্চতর নির্ভুলতা প্রকারটি ব্যবহার করে সমস্ত ভাসমান-পয়েন্ট অপারেশনগুলি সম্পাদন করে। কেবলমাত্র পারফরম্যান্সে অতিরিক্ত ব্যয়ে এই জাতীয় হার্ডওয়্যার আর্কিটেকচারগুলি কম নির্ভুলতার সাথে ভাসমান-বিন্দু ক্রিয়াকলাপ সম্পাদন করা যেতে পারে এবং পারফরম্যান্স এবং যথার্থতা উভয়ই বাজেয়াপ্ত করার জন্য একটি প্রয়োগের প্রয়োজনের পরিবর্তে সি # উচ্চতর নির্ভুলতার ধরণের সমস্ত ভাসমান-পয়েন্ট ক্রিয়াকলাপের জন্য ব্যবহার করতে দেয় । আরও সুনির্দিষ্ট ফলাফল সরবরাহ করা ব্যতীত এর খুব কমই কোনও পরিমাপযোগ্য প্রভাব রয়েছে। তবে, x * y / z ফর্মের প্রকাশে,

সি # কমপক্ষে আইইইই 754 এর স্তরে নির্ভুলতার স্তর সরবরাহের জন্য অপারেশনগুলির গ্যারান্টি দেয় , তবে অগত্যা ঠিক এটি হয় না। এটি কোনও বাগ নয়, এটি একটি বৈশিষ্ট্যযুক্ত বৈশিষ্ট্য। রোজলিন সংকলক আইইইই 754 সুনির্দিষ্টভাবে রেফারেন্সটি মূল্যায়ন করার অধিকারে রয়েছে এবং অন্য সংকলকটি যখন সেট করা 2^32 + 7হয় 7তখন তা হ্রাস করার অধিকারে থাকে uint

আমার প্রথম বিভ্রান্তিকর উত্তরের জন্য আমি দুঃখিত, তবে কমপক্ষে আমরা সবাই আজ কিছু শিখেছি।


তারপরে আমি অনুমান করি আমাদের বর্তমান। নেট ফ্রেমওয়ার্ক সংকলকটিতে একটি বাগ আছে (আমি সুনির্দিষ্ট হওয়ার জন্য VS 2019 তে চেষ্টা করেছি) :) আমি অনুমান করি যে এখানে কোনও বাগ লগ করার জন্য কোথাও আছে কিনা দেখার চেষ্টা করব, যদিও এর মতো কিছু ঠিক করা হবে সম্ভবত অনেকগুলি অযাচিত পার্শ্ব প্রতিক্রিয়া থাকতে পারে এবং সম্ভবত এড়ানো হবে ...
লুকাশ

আমি মনে করি না এটি অসময়ে ইন্টিমেটেড ingালছে, যেগুলি প্রচুর মামলায় অনেক বেশি পরিষ্কার সমস্যা তৈরি করবে, আমি এখানে অনুমান করি যে কনস্টের ক্রিয়াকলাপে এটি মানটি মূল্যায়ন করে না এবং একে শেষ অবধি এটি ingালাই করে না, মানে
ভাসমানগুলিতে

@ জালশ আমি আপনার অনুমানটি বুঝতে পেরেছি বলে মনে করি না। সংকলক যদি কেবল প্রতিটিটিকে scaleফ্লোট মান দিয়ে প্রতিস্থাপন করে এবং তারপরে রানটাইমের সময় অন্য সমস্ত কিছুর মূল্যায়ন করে তবে ফলাফলটি একই হবে। তুমি কি বিস্তারিত বলতে পারো?
V0ldek

@ ভি0ल्डেক, ডাউনভোটটি একটি ভুল ছিল, আমি আপনার উত্তরটি সম্পাদনা করেছি যাতে আমি এটি সরিয়ে ফেলতে পারি :)
জালশ

আমার অনুমান যে এটি আসলে মধ্যবর্তী মানগুলিকে ফ্লোটে সংরক্ষণ করেনি, এটি কেবলমাত্র এক্সপ্রেশন দিয়ে f কে প্রতিস্থাপন করেছিল যা
এফটিকে

0

এখানে পয়েন্টটি হ'ল (আপনি ডক্সে দেখতে পাচ্ছেন ) যে ভাসমান মানগুলির কেবলমাত্র 2 ^ 24 অবধি বেস থাকতে পারে । সুতরাং, আপনি যখন 2 ^ 32 ( 64 * 2014 * 164 * 1024 = 2 ^ 6 * 2 ^ 10 * 2 ^ 6 * 2 ^ 10 = 2 ^ 32 ) এর একটি মূল্য নির্ধারণ করেন তখন এটি হয়ে যায়, আসলে 2 ^ 24 * 2 ^ 8 , যা 4294967000 । যোগ করার পদ্ধতি 7 অংশ মাত্র রূপান্তর দ্বারা ছেঁটে ফেলা যোগ করা হবে ulong

আপনি যদি দ্বিগুণ হয়ে যান , যার ভিত্তি 2 ^ 53 , এটি আপনার পছন্দসই জন্য কাজ করবে।

এটি একটি রান-টাইম সমস্যা হতে পারে তবে এই ক্ষেত্রে এটি একটি সংকলন-সময় সমস্যা, কারণ সমস্ত মান ধ্রুবক এবং সংকলক দ্বারা মূল্যায়ন করা হবে।


-2

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

দ্বিতীয় বিষয় আপনি অন্তর্নিহিত এবং স্পষ্ট রূপান্তর মিশ্রিত করা হয়। আমি রোজলিন সংকলক সম্পর্কে নিশ্চিত নই, তবে অবশ্যই। নেট ফ্রেমওয়ার্ক এবং। নেট কোর সংকলকগুলি এই ক্রিয়াকলাপগুলির জন্য বিভিন্ন অপ্টিমাইজেশন ব্যবহার করতে পারে।

এখানে সমস্যাটি হ'ল আপনার কোডের প্রথম লাইনটি কেবল ভাসমান পয়েন্টের মান / প্রকারগুলি ব্যবহার করে তবে দ্বিতীয় লাইনটি ভাসমান পয়েন্টের মান / প্রকার এবং অবিচ্ছেদ্য মান / প্রকারের সংমিশ্রণ।

আপনি সরাসরি ইন্টিজার ফ্লোটিং পয়েন্ট টাইপ করুন (7> 7.0) আপনি তিনটি সংকলিত উত্সের জন্য খুব একই ফলাফল পাবেন।

using System;

public class Program
{
    const float scale = 64 * 1024;

    public static void Main()
    {
        Console.WriteLine(unchecked((uint)(ulong)(1.2 * scale * scale + 1.5 * scale))); // 859091763
        Console.WriteLine(unchecked((uint)(ulong)(scale * scale + 7.0))); // 7
    }
}

সুতরাং, আমি V0ldek জবাব দিয়েছি তার বিপরীতে বলব এবং এটি হ'ল বাগ (যদি এটি সত্যই কোনও বাগ হয়) রোজলিন এবং। নেট কোর সংকলকগুলিতে সম্ভবত "।

এটি বিশ্বাস করার আরেকটি কারণ হ'ল প্রথম চেক না করা গণনার ফলাফল সকলের জন্য একই এবং এটি এমন মান যে UInt32টাইপের সর্বাধিক মানকে উপচে ফেলে ।

Console.WriteLine(unchecked((uint)(ulong)(1.2 * scale * scale + 1.5 * scale) - UInt32.MaxValue - 1)); // 859091763

আমরা শূন্য থেকে শুরু করার সাথে মাইনাস এক রয়েছে যা মানটি যা নিজেকে বিয়োগ করা শক্ত। ওভারফ্লো সম্পর্কে আমার গণিতের বোধগম্যতা যদি সঠিক হয় তবে আমরা সর্বাধিক মানের পরে পরবর্তী সংখ্যা থেকে শুরু করি।

হালনাগাদ

জলশ মন্তব্য অনুসারে

7.0 হ'ল একটি ডাবল, ভাসা নয়, চেষ্টা করুন 7.0f, এটি আপনাকে এখনও 0 দিবে

তাঁর মন্তব্যটি সঠিক। যদি আমরা ফ্লোট ব্যবহার করি তবে আপনি এখনও রোজলিন এবং। নেট কোরের জন্য 0 পান তবে অন্যদিকে 7-এ ডাবল ফলাফল ব্যবহার করে।

আমি কিছু অতিরিক্ত পরীক্ষা করেছি এবং জিনিসগুলি আরও অস্থির হয়ে উঠেছে, তবে শেষ পর্যন্ত সবকিছু বোধগম্য হয় (অন্তত কিছুটা)।

আমি যা অনুমান করি তা হ'ল নেট ফ্রেমওয়ার্ক 4.7.2 সংকলক (2018 সালের মাঝামাঝি সময়ে প্রকাশিত) .NET কোর 3.1 এবং রোজলিন 3.4 সংকলক (2019 এর শেষে প্রকাশিত) এর চেয়ে সত্যই বিভিন্ন অপ্টিমাইজেশন ব্যবহার করে। এই বিভিন্ন অপ্টিমাইজেশন / গণনা সংকলন সময়ে পরিচিত ধ্রুবক মান জন্য বিশুদ্ধভাবে ব্যবহৃত হয়। সে কারণেই uncheckedকীওয়ার্ডটি ব্যবহার করার প্রয়োজন ছিল কারণ সংকলক ইতিমধ্যে জানে যে ওভারফ্লো ঘটছে, তবে চূড়ান্ত আইএলকে অনুকূলকরণের জন্য আলাদা আলাদা গণনা ব্যবহৃত হয়েছিল।

IL_000a নির্দেশনা বাদে একই উত্স কোড এবং প্রায় একই আইএল। একটি সংকলক 7 এবং অন্যান্য 0 গণনা করে।

সোর্স কোড

using System;

public class Program
{
    const float scale = 64 * 1024;

    public static void Main()
    {
        Console.WriteLine(unchecked((uint)(ulong)(1.2 * scale * scale + 1.5 * scale)));
        Console.WriteLine(unchecked((uint)(scale * scale + 7.0)));
    }
}

.NET ফ্রেমওয়ার্ক (x64) আইএল

.class private auto ansi '<Module>'
{
} // end of class <Module>

.class public auto ansi beforefieldinit Program
    extends [mscorlib]System.Object
{
    // Fields
    .field private static literal float32 scale = float32(65536)

    // Methods
    .method public hidebysig static 
        void Main () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 17 (0x11)
        .maxstack 8

        IL_0000: ldc.i4 859091763
        IL_0005: call void [mscorlib]System.Console::WriteLine(uint32)
        IL_000a: ldc.i4.7
        IL_000b: call void [mscorlib]System.Console::WriteLine(uint32)
        IL_0010: ret
    } // end of method Program::Main

    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2062
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ret
    } // end of method Program::.ctor

} // end of class Program

রোজলিন সংকলক শাখা (সেপ্টেম্বর 2019) আইএল

.class private auto ansi '<Module>'
{
} // end of class <Module>

.class public auto ansi beforefieldinit Program
    extends [System.Private.CoreLib]System.Object
{
    // Fields
    .field private static literal float32 scale = float32(65536)

    // Methods
    .method public hidebysig static 
        void Main () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 17 (0x11)
        .maxstack 8

        IL_0000: ldc.i4 859091763
        IL_0005: call void [System.Console]System.Console::WriteLine(uint32)
        IL_000a: ldc.i4.0
        IL_000b: call void [System.Console]System.Console::WriteLine(uint32)
        IL_0010: ret
    } // end of method Program::Main

    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2062
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [System.Private.CoreLib]System.Object::.ctor()
        IL_0006: ret
    } // end of method Program::.ctor

} // end of class Program

আপনি uncheckedনীচের মত অ-ধ্রুবক এক্সপ্রেশন (ডিফল্টরূপে ) যুক্ত করলে এটি সঠিক পথে যেতে শুরু করে।

using System;

public class Program
{
    static Random random = new Random();

    public static void Main()
    {
        var scale = 64 * random.Next(1024, 1025);       
        uint f = (uint)(ulong)(scale * scale + 7f);
        uint d = (uint)(ulong)(scale * scale + 7d);
        uint i = (uint)(ulong)(scale * scale + 7);

        Console.WriteLine((uint)(ulong)(1.2 * scale * scale + 1.5 * scale)); // 859091763
        Console.WriteLine((uint)(ulong)(scale * scale + 7f)); // 7
        Console.WriteLine(f); // 7
        Console.WriteLine((uint)(ulong)(scale * scale + 7d)); // 7
        Console.WriteLine(d); // 7
        Console.WriteLine((uint)(ulong)(scale * scale + 7)); // 7
        Console.WriteLine(i); // 7
    }
}

যা উভয় সংকলক দ্বারা "ঠিক" একই আইএল উত্পন্ন করে।

.NET ফ্রেমওয়ার্ক (x64) আইএল

.class private auto ansi '<Module>'
{
} // end of class <Module>

.class public auto ansi beforefieldinit Program
    extends [mscorlib]System.Object
{
    // Fields
    .field private static class [mscorlib]System.Random random

    // Methods
    .method public hidebysig static 
        void Main () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 164 (0xa4)
        .maxstack 4
        .locals init (
            [0] int32,
            [1] uint32,
            [2] uint32
        )

        IL_0000: ldc.i4.s 64
        IL_0002: ldsfld class [mscorlib]System.Random Program::random
        IL_0007: ldc.i4 1024
        IL_000c: ldc.i4 1025
        IL_0011: callvirt instance int32 [mscorlib]System.Random::Next(int32, int32)
        IL_0016: mul
        IL_0017: stloc.0
        IL_0018: ldloc.0
        IL_0019: ldloc.0
        IL_001a: mul
        IL_001b: conv.r4
        IL_001c: ldc.r4 7
        IL_0021: add
        IL_0022: conv.u8
        IL_0023: conv.u4
        IL_0024: ldloc.0
        IL_0025: ldloc.0
        IL_0026: mul
        IL_0027: conv.r8
        IL_0028: ldc.r8 7
        IL_0031: add
        IL_0032: conv.u8
        IL_0033: conv.u4
        IL_0034: stloc.1
        IL_0035: ldloc.0
        IL_0036: ldloc.0
        IL_0037: mul
        IL_0038: ldc.i4.7
        IL_0039: add
        IL_003a: conv.i8
        IL_003b: conv.u4
        IL_003c: stloc.2
        IL_003d: ldc.r8 1.2
        IL_0046: ldloc.0
        IL_0047: conv.r8
        IL_0048: mul
        IL_0049: ldloc.0
        IL_004a: conv.r8
        IL_004b: mul
        IL_004c: ldc.r8 1.5
        IL_0055: ldloc.0
        IL_0056: conv.r8
        IL_0057: mul
        IL_0058: add
        IL_0059: conv.u8
        IL_005a: conv.u4
        IL_005b: call void [mscorlib]System.Console::WriteLine(uint32)
        IL_0060: ldloc.0
        IL_0061: ldloc.0
        IL_0062: mul
        IL_0063: conv.r4
        IL_0064: ldc.r4 7
        IL_0069: add
        IL_006a: conv.u8
        IL_006b: conv.u4
        IL_006c: call void [mscorlib]System.Console::WriteLine(uint32)
        IL_0071: call void [mscorlib]System.Console::WriteLine(uint32)
        IL_0076: ldloc.0
        IL_0077: ldloc.0
        IL_0078: mul
        IL_0079: conv.r8
        IL_007a: ldc.r8 7
        IL_0083: add
        IL_0084: conv.u8
        IL_0085: conv.u4
        IL_0086: call void [mscorlib]System.Console::WriteLine(uint32)
        IL_008b: ldloc.1
        IL_008c: call void [mscorlib]System.Console::WriteLine(uint32)
        IL_0091: ldloc.0
        IL_0092: ldloc.0
        IL_0093: mul
        IL_0094: ldc.i4.7
        IL_0095: add
        IL_0096: conv.i8
        IL_0097: conv.u4
        IL_0098: call void [mscorlib]System.Console::WriteLine(uint32)
        IL_009d: ldloc.2
        IL_009e: call void [mscorlib]System.Console::WriteLine(uint32)
        IL_00a3: ret
    } // end of method Program::Main

    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2100
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ret
    } // end of method Program::.ctor

    .method private hidebysig specialname rtspecialname static 
        void .cctor () cil managed 
    {
        // Method begins at RVA 0x2108
        // Code size 11 (0xb)
        .maxstack 8

        IL_0000: newobj instance void [mscorlib]System.Random::.ctor()
        IL_0005: stsfld class [mscorlib]System.Random Program::random
        IL_000a: ret
    } // end of method Program::.cctor

} // end of class Program

রোজলিন সংকলক শাখা (সেপ্টেম্বর 2019) আইএল

.class private auto ansi '<Module>'
{
} // end of class <Module>

.class public auto ansi beforefieldinit Program
    extends [System.Private.CoreLib]System.Object
{
    // Fields
    .field private static class [System.Private.CoreLib]System.Random random

    // Methods
    .method public hidebysig static 
        void Main () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 164 (0xa4)
        .maxstack 4
        .locals init (
            [0] int32,
            [1] uint32,
            [2] uint32
        )

        IL_0000: ldc.i4.s 64
        IL_0002: ldsfld class [System.Private.CoreLib]System.Random Program::random
        IL_0007: ldc.i4 1024
        IL_000c: ldc.i4 1025
        IL_0011: callvirt instance int32 [System.Private.CoreLib]System.Random::Next(int32, int32)
        IL_0016: mul
        IL_0017: stloc.0
        IL_0018: ldloc.0
        IL_0019: ldloc.0
        IL_001a: mul
        IL_001b: conv.r4
        IL_001c: ldc.r4 7
        IL_0021: add
        IL_0022: conv.u8
        IL_0023: conv.u4
        IL_0024: ldloc.0
        IL_0025: ldloc.0
        IL_0026: mul
        IL_0027: conv.r8
        IL_0028: ldc.r8 7
        IL_0031: add
        IL_0032: conv.u8
        IL_0033: conv.u4
        IL_0034: stloc.1
        IL_0035: ldloc.0
        IL_0036: ldloc.0
        IL_0037: mul
        IL_0038: ldc.i4.7
        IL_0039: add
        IL_003a: conv.i8
        IL_003b: conv.u4
        IL_003c: stloc.2
        IL_003d: ldc.r8 1.2
        IL_0046: ldloc.0
        IL_0047: conv.r8
        IL_0048: mul
        IL_0049: ldloc.0
        IL_004a: conv.r8
        IL_004b: mul
        IL_004c: ldc.r8 1.5
        IL_0055: ldloc.0
        IL_0056: conv.r8
        IL_0057: mul
        IL_0058: add
        IL_0059: conv.u8
        IL_005a: conv.u4
        IL_005b: call void [System.Console]System.Console::WriteLine(uint32)
        IL_0060: ldloc.0
        IL_0061: ldloc.0
        IL_0062: mul
        IL_0063: conv.r4
        IL_0064: ldc.r4 7
        IL_0069: add
        IL_006a: conv.u8
        IL_006b: conv.u4
        IL_006c: call void [System.Console]System.Console::WriteLine(uint32)
        IL_0071: call void [System.Console]System.Console::WriteLine(uint32)
        IL_0076: ldloc.0
        IL_0077: ldloc.0
        IL_0078: mul
        IL_0079: conv.r8
        IL_007a: ldc.r8 7
        IL_0083: add
        IL_0084: conv.u8
        IL_0085: conv.u4
        IL_0086: call void [System.Console]System.Console::WriteLine(uint32)
        IL_008b: ldloc.1
        IL_008c: call void [System.Console]System.Console::WriteLine(uint32)
        IL_0091: ldloc.0
        IL_0092: ldloc.0
        IL_0093: mul
        IL_0094: ldc.i4.7
        IL_0095: add
        IL_0096: conv.i8
        IL_0097: conv.u4
        IL_0098: call void [System.Console]System.Console::WriteLine(uint32)
        IL_009d: ldloc.2
        IL_009e: call void [System.Console]System.Console::WriteLine(uint32)
        IL_00a3: ret
    } // end of method Program::Main

    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2100
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [System.Private.CoreLib]System.Object::.ctor()
        IL_0006: ret
    } // end of method Program::.ctor

    .method private hidebysig specialname rtspecialname static 
        void .cctor () cil managed 
    {
        // Method begins at RVA 0x2108
        // Code size 11 (0xb)
        .maxstack 8

        IL_0000: newobj instance void [System.Private.CoreLib]System.Random::.ctor()
        IL_0005: stsfld class [System.Private.CoreLib]System.Random Program::random
        IL_000a: ret
    } // end of method Program::.cctor

} // end of class Program

সুতরাং, শেষ পর্যন্ত আমি বিশ্বাস করি যে বিভিন্ন আচরণের কারণ হ'ল ফ্রেমওয়ার্ক এবং / অথবা সংকলকগুলির একটি ভিন্ন সংস্করণ যা ধ্রুবক প্রকাশের জন্য বিভিন্ন অপ্টিমাইজেশন / গণনা ব্যবহার করছে তবে অন্যান্য ক্ষেত্রে আচরণটি খুব একই।


7.0 একটি ডাবল, একটি ফ্লোট নয়, 7.0f চেষ্টা করে দেখুন, এটি আপনাকে এখনও 0
জালশ

হ্যাঁ, এটি ভাসমান নয়, ভাসমান পয়েন্ট টাইপ হওয়া উচিত। সংশোধনের জন্য ধন্যবাদ।
ড্রপআউটকোডার 20:50

এটি ইস্যুটির পুরো দৃষ্টিকোণকে বদলে দেয়, আপনি যে দ্বিগুণ নির্ভুলতা পাবেন তার সাথে ডিল করার সময় ফলাফলটি অনেক বেশি এবং ভি0ल्डেকের উত্তরে বর্ণিত পরিবর্তনটি ব্যাপকভাবে ব্যাখ্যা করা হয়েছে, আপনি সম্ভবত স্কেল পরিবর্তন করে ডাবল করে আবার যাচাই করতে পারেন, ফলাফলগুলি একই হবে। ..
জলশ

শেষ পর্যন্ত এটি আরও জটিল সমস্যা।
ড্রপআউটকোডার

1
@ জালশ হ্যাঁ, তবে একটি সংকলক পতাকা রয়েছে যা পরীক্ষিত প্রসঙ্গটি সর্বত্র ঘুরিয়ে দেয়। সুরক্ষার জন্য আপনি সমস্ত কিছু পরীক্ষা করতে চান, একটি নির্দিষ্ট গরম পথ ছাড়া এটি পেতে পারে এমন সমস্ত সিপিইউ চক্রের প্রয়োজন।
V0ldek
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.