নীচের কোডটি ভিজ্যুয়াল স্টুডিও ২০০৮ এ অপটিমাইজেশন সহ এবং ছাড়া কাজ করে। তবে এটি কেবল অপ্টিমাইজেশন (O0) ছাড়াই g ++ এ কাজ করে।
#include <cstdlib>
#include <iostream>
#include <cmath>
double round(double v, double digit)
{
double pow = std::pow(10.0, digit);
double t = v * pow;
//std::cout << "t:" << t << std::endl;
double r = std::floor(t + 0.5);
//std::cout << "r:" << r << std::endl;
return r / pow;
}
int main(int argc, char *argv[])
{
std::cout << round(4.45, 1) << std::endl;
std::cout << round(4.55, 1) << std::endl;
}
আউটপুটটি হওয়া উচিত:
4.5
4.6
তবে অপ্টিমাইজেশান ( O1
- O3
) সহ জি ++ আউটপুট আসবে:
4.5
4.5
যদি আমি volatile
টির আগে কীওয়ার্ডটি যুক্ত করি তবে এটি কাজ করে, তাই কোনও ধরণের অপ্টিমাইজেশন বাগ থাকতে পারে?
জি ++ 4.1.2 এবং 4.4.4 এ পরীক্ষা করুন।
আইডিয়োন-এর ফলাফল এখানে: http://ideone.com/Rz937
এবং g ++ এ আমি যা বিকল্প পরীক্ষা করি তা সহজ:
g++ -O2 round.cpp
আরও আকর্ষণীয় ফলাফল, এমনকি আমি /fp:fast
ভিজ্যুয়াল স্টুডিও ২০০৮-এর বিকল্পটি চালু করি , ফলাফলটি এখনও সঠিক।
আরও প্রশ্ন:
আমি ভাবছিলাম, আমি কি সবসময় -ffloat-store
বিকল্পটি চালু করব ?
কারণ আমি পরীক্ষিত জি ++ সংস্করণটি সেন্টোস / রেড হ্যাট লিনাক্স 5 এবং সেন্টোস / রেডহ্যাট 6 দিয়ে পাঠানো হয়েছে ।
আমি এই প্ল্যাটফর্মগুলির অধীনে আমার অনেকগুলি প্রোগ্রাম সংকলন করেছি এবং আমি উদ্বিগ্ন যে এটি আমার প্রোগ্রামগুলির মধ্যে অপ্রত্যাশিত বাগ তৈরি করবে। আমার সমস্ত সি ++ কোড এবং ব্যবহৃত লাইব্রেরিগুলিতে তাদের এ জাতীয় সমস্যা আছে কিনা তা অনুসন্ধান করা কিছুটা কঠিন বলে মনে হচ্ছে। যেকোনো পরামর্শ?
এমনকি কেন /fp:fast
চালু করা হয়েছে, ভিজ্যুয়াল স্টুডিও ২০০৮ এখনও কাজ করে? দেখে মনে হচ্ছে ভিজ্যুয়াল স্টুডিও ২০০৮ জি ++ এর চেয়ে এই সমস্যায় বেশি নির্ভরযোগ্য?