আমার নিম্নোক্ত সাধারণ কোড রয়েছে:
int speed1 = (int)(6.2f * 10);
float tmp = 6.2f * 10;
int speed2 = (int)tmp;
speed1
এবং speed2
একই মান হওয়া উচিত, কিন্তু আসলে, আমার আছে:
speed1 = 61
speed2 = 62
আমি জানি আমার সম্ভবত কাস্টিংয়ের পরিবর্তে ম্যাথ ব্যবহার করা উচিত ound তবে আমি কেন মানগুলি আলাদা তা বুঝতে চাই।
আমি জেনারেটেড বাইটকোডের দিকে তাকালাম, তবে একটি স্টোর এবং বোঝা বাদে অপকডগুলি একই।
আমি জাভাতেও একই কোডটি চেষ্টা করেছি এবং আমি সঠিকভাবে 62 এবং 62 পেয়েছি।
কেউ এই ব্যাখ্যা করতে পারেন?
সম্পাদনা করুন: আসল কোডে এটি সরাসরি 6.2f * 10 নয়, একটি ফাংশন কল * একটি ধ্রুবক। আমার কাছে নিম্নলিখিত বাইকোড রয়েছে:
জন্য speed1
:
IL_01b3: ldloc.s V_8
IL_01b5: callvirt instance float32 myPackage.MyClass::getSpeed()
IL_01ba: ldc.r4 10.
IL_01bf: mul
IL_01c0: conv.i4
IL_01c1: stloc.s V_9
জন্য speed2
:
IL_01c3: ldloc.s V_8
IL_01c5: callvirt instance float32 myPackage.MyClass::getSpeed()
IL_01ca: ldc.r4 10.
IL_01cf: mul
IL_01d0: stloc.s V_10
IL_01d2: ldloc.s V_10
IL_01d4: conv.i4
IL_01d5: stloc.s V_11
আমরা দেখতে পাচ্ছি যে অপারেশনগুলি ভাসমান এবং একমাত্র পার্থক্য stloc/ldloc
।
ভার্চুয়াল মেশিন হিসাবে, আমি একই ফলাফলের সাথে মনো / উইন 7, মনো / ম্যাকোস এবং। নেট / উইন্ডোজ দিয়ে চেষ্টা করেছি।