@ অঞ্জিউ যেমন উল্লেখ করেছেন , !=
অপারেটরের উভয় পক্ষের একই ধরণের প্রয়োজন।
(float)i != i
আরএইচএসের প্রচারের ফলাফলটিও ভাসতে শুরু করে, তাই আমাদের কাছে রয়েছে (float)i != (float)i
।
g ++ একটি অসীম লুপও জেনারেট করে, তবে এটি এর ভিতর থেকে কাজটি অপ্টিমাইজ করে না। আপনি এটি রূপান্তর করতে পারবেন-> এর সাথে ভাসা cvtsi2ss
এবং নিজের সাথে ucomiss xmm0,xmm0
তুলনা (float)i
করতে পারেন। (এটিই ছিল আপনার প্রথম সূত্র যা আপনার সি ++ উত্সের অর্থ এটি নয় যা আপনি এটি ভেবেছিলেন এটি পছন্দ করেছেন @ অ্যাঞ্জের উত্তর ব্যাখ্যা করে))
x != x
এটি তখনই সত্য যখন এটি "অর্ডারড" হয় কারণ x
এটি এনএন ছিল। ( INFINITY
আইইইই গণিতে নিজের সাথে সমান তুলনা করে তবে এনএনএন NAN == NAN
মিথ্যা নয়, NAN != NAN
সত্য)।
gcc7.4 এবং তার চেয়ে বেশি পুরানো আপনার কোডটিকে jnp
লুপ শাখা হিসাবে যথাযথভাবে অনুকূল করে তোলে ( https://godbolt.org/z/fyOhW1 ): যতক্ষণ অপারেশনগুলি x != x
NaN ছিল না ততক্ষণ লুপিং চালিয়ে যান । (gcc8 এবং পরবর্তীকালে je
লুপটি বিরতিতে পরীক্ষা করে, এটি কোনও নন-এনএন ইনপুট জন্য সর্বদা সত্য হবে এই তথ্যের উপর ভিত্তি করে অনুকূলিতকরণে ব্যর্থ হয়েছে)। x86 এফপি অর্ডারযুক্ত উপর সেট পিএফ তুলনা করে।
আর BTW, মানে ঝনঝন এর অপ্টিমাইজেশান এছাড়াও নিরাপদ : এটা শুধু সিএসই হয়েছে (float)i != (implicit conversion to float)i
একই হচ্ছে, এবং প্রমাণ করা যে i -> float
সম্ভাব্য পরিসর জন্য nan না হয় int
।
(যদিও এই লুপটি স্বাক্ষরিত-ওভারফ্লো ইউবিতে আঘাত করবে, এটি ud2
অবৈধ নির্দেশনা সহ , বা লুপের বডিটি আসলে কী ছিল তা নির্বিশেষে একটি ফাঁকা অসীম লুপটি আক্ষরিক অর্থে যে কোনও এসেম ছাড়তে পারে allowed ) তবে স্বাক্ষরিত ওভারফ্লো ইউবি উপেক্ষা করে , এই অপ্টিমাইজেশানটি এখনও 100% আইনী।
স্বাক্ষরিত-পূর্ণসংখ্যা ওভারফ্লো ভালভাবে সংজ্ঞায়িত করা (2 এর পরিপূরক wraparound হিসাবে) এমনকি-fwrapv
লুপ বডিটি অপ্টিমাইজ করতে ব্যর্থ হয় G https://godbolt.org/z/t9A8t_
এমনকি সক্ষম করাও -fno-trapping-math
সহায়তা করে না। (জিসিসির ডিফল্ট দুর্ভাগ্যক্রমে সক্ষম করা
-ftrapping-math
সত্ত্বেও এটি জিসিসির প্রয়োগটি ভাঙ্গা / বগি হওয়া সত্ত্বেও সক্ষম হয়েছে )) ইনট-> ফ্লোট রূপান্তর কোনও এফপির নিখরচায় ব্যতিক্রম ঘটতে পারে (সংখ্যায় খুব বড় সংখ্যার পক্ষে হুবহু উপস্থাপন করা যায়), তাই ব্যতিক্রমগুলি সম্ভবত অনমাস্ক করা যুক্তিসঙ্গত নয় লুপ শরীর দূরে অপ্টিমাইজ করুন। (কারণ ভাসায় রূপান্তর 16777217
করা যদি পর্যবেক্ষণযোগ্য পার্শ্ব-প্রতিক্রিয়া ঘটাতে পারে তবে যদি অক্ষত ব্যতিক্রমটি আনমস্ক করা না থাকে))
তবে এর সাথে -O3 -fwrapv -fno-trapping-math
এটি খালি অসীম লুপকে সংকলন না করার জন্য এটি 100% মিসড অপটিমাইজেশন। ছাড়া #pragma STDC FENV_ACCESS ON
, মুখোশযুক্ত এফপি ব্যতিক্রমগুলি রেকর্ড করে এমন স্টিকি ফ্ল্যাগগুলির অবস্থা কোডটির একটি পর্যবেক্ষণযোগ্য পার্শ্ব-প্রতিক্রিয়া নয়। না int
-> float
রূপান্তর NaN এর ফলস্বরূপ x != x
হতে পারে , তাই সত্য হতে পারে না।
এই সংকলকগুলি সমস্ত সি ++ বাস্তবায়নের জন্য অপ্টিমাইজ করছে যা আইইইই 754 একক-নির্ভুলতা (বাইনারি 32) float
এবং 32-বিট ব্যবহার করে int
।
Bugfixed(int)(float)i != i
লুপ সংকীর্ণ 16 বিট সঙ্গে সি ++ বাস্তবায়নের উপর UB হবে int
এবং / অথবা ব্যাপকতর float
কারণ আপনার আঘাত করি, সাইন-পূর্ণসংখ্যা ওভারফ্লো UB প্রথম পূর্ণসংখ্যা করে একটি যেমন ঠিক representable ছিল না উপনীত হওয়ার আগে float
।
X86-64 সিস্টেম ভি এবিআই-র সাথে জিসিসি বা ঝাঁকুনির মতো প্রয়োগের জন্য সংকলন করার সময়, ইউবি-র প্রয়োগের জন্য নির্ধারিত বিভিন্ন সংকলনের অধীনে কোনও নেতিবাচক পরিণতি হয় না।
বিটিডাব্লু, আপনি সংজ্ঞায়িত থেকে FLT_RADIX
এবং এই লুপটির ফলাফলটি স্থিরভাবে গণনা করতে পারেন । বা কমপক্ষে আপনি তাত্ত্বিকভাবে বলতে পারেন, যদি সত্যই কোনও আইজিইই ফ্লোটের মডেলটি ফিট করে তবে কোনও পজিট / আনুমের মতো অন্য কোনও ধরণের আসল-সংখ্যা উপস্থাপনার চেয়ে।FLT_MANT_DIG
<climits>
float
আমি নিশ্চিত নই যে float
আচরণের বিষয়ে আইএসও সি ++ স্ট্যান্ডার্ড নখগুলি কতটা নিচে রেখেছিল এবং কোনও ফর্ম্যাট যা স্থির-প্রস্থের এক্সপোনিস্ট এবং তাত্পর্যপূর্ণ ক্ষেত্রগুলির উপর ভিত্তি করে না ছিল মানদণ্ড অনুসারে হবে কিনা।
মন্তব্যে:
@ গেজা আমি ফলাফলের সংখ্যাটি শুনতে আগ্রহী!
@ নাদা: এটি 16777216
আপনি কি দাবি করছেন যে আপনি এই লুপটি মুদ্রণ / ফেরতের জন্য পেয়েছেন 16777216
?
আপডেট: যেহেতু সেই মন্তব্য মুছে ফেলা হয়েছে, আমার মনে হয় না। সম্ভবত ওপি float
প্রথম পূর্ণসংখ্যার ঠিক আগে উদ্ধৃতি দিচ্ছে যা 32-বিট হিসাবে ঠিক উপস্থাপন করা যায় না float
। https://en.wikedia.org/wiki/Single-precision_floating- point_format# Precision_limits_on_integer_values অর্থাত্ তারা কীভাবে এই বগি কোডটি দিয়ে যাচাই করার প্রত্যাশা করেছিল।
Bugfixed সংস্করণ would অবশ্যই মুদ্রণ 16777217
, প্রথম পূর্ণসংখ্যা যে না ঠিক representable, বরং তার আগে মানের চেয়ে।
(সমস্ত উচ্চতর ভাসমান মানগুলি হুবহু পূর্ণসংখ্যা হয় তবে তা তাত্ত্বিক প্রস্থের চেয়ে বেশি পরিমাণের মানগুলির জন্য 2, তারপরে 4, তারপরে 8 ইত্যাদির গুণক হয় Many অনেকগুলি উচ্চতর পূর্ণসংখ্যার মান উপস্থাপন করা যায় তবে শেষ স্থানে 1 ইউনিট (তাত্পর্যপূর্ণ) 1 এর চেয়ে বড় হয় সুতরাং তারা সংখ্যার পূর্ণসংখ্যার হয় না The বৃহত্তম সীমাবদ্ধতা কেবল float
2 ^ 128 এর নিচে থাকে, এটি এমনকি সমান জন্য খুব বড় int64_t
)
যদি কোনও সংকলক আসল লুপ থেকে প্রস্থান করে এবং মুদ্রণ করে তবে এটি একটি সংকলক বাগ হবে।