اطلاعیه

Collapse
No announcement yet.

مشکل با قرار گیری عدد اعشاری در متغیر int

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل با قرار گیری عدد اعشاری در متغیر int

    کد:
    TIMER_COUNTER_TEMP=(_dt*F_CPU)/(1024*256);
    سوال من اینه که من TIMER_COUNTER_TEMP رو از نوع unsigned int تعریف کردم ، پس اگه مقدار روبه روی اون تو تساوی بالا عددی اعشاری شد ، فقط مقدار صحیحش رو داخل متغیر میریزه...
    ولی مشکلی که هست اینه که من عبارت بالا رو داخل if میذارم ولی if اصلا اجرا نمیشه ولی اگه به جای اون عبارت مقدار صحیحش رو بذارم درست کار میکنه...مگه نباید مقدار صحیح یک عدد اعشاری داخل اون متغیر قرار بگیره؟
    سپاس فراوان
    تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

    www.intelart.ir


    ساخت کنترلر دما PID فازي با AVR [آموزشی]

    #2
    پاسخ : مشکل با قرار گیری عدد اعشاری در متغیر int

    شرطِ if رو دقیق بنویس تا بگم مشکلش چیه. معمولاً if با شرط تساوی متغیر اعشاری، در 99% مواقع غلط از آب در میاد. کدِ زیر رو توی هر کامپایلری که دوست دارید اجرا کنید ببینید نتیجه چی می شه:
    کد:
    float xf=0.0;
    int k=0;
    for(k=0; k<1000; k++)
      x += 0.01;
    if(x==30.0)
      do_something...
    برای تغییر نوع متغیرها بهتره از تبدیلِ نوع (Type Casting) استفاده کنید. یا جاهایی که متغیرهای انواع مختلف رو توی هم ضرب و تقسیم می کنید. تقدم ضرب و تقسیم ها رو هم خودتون با پرانتز مشخص کنید. مخصوصاً توی کامپایلرهای میکروکنترلرها.
    بیایید با Google آشتی کنیم!

    دیدگاه


      #3
      پاسخ : مشکل با قرار گیری عدد اعشاری در متغیر int

      نوشته اصلی توسط محمد رستمی
      شرطِ if رو دقیق بنویس تا بگم مشکلش چیه. معمولاً if با شرط تساوی متغیر اعشاری، در 99% مواقع غلط از آب در میاد. کدِ زیر رو توی هر کامپایلری که دوست دارید اجرا کنید ببینید نتیجه چی می شه:
      کد:
      float xf=0.0;
      int k=0;
      for(k=0; k<1000; k++)
        x += 0.01;
      if(x==30.0)
        do_something...
      برای تغییر نوع متغیرها بهتره از تبدیلِ نوع (Type Casting) استفاده کنید. یا جاهایی که متغیرهای انواع مختلف رو توی هم ضرب و تقسیم می کنید. تقدم ضرب و تقسیم ها رو هم خودتون با پرانتز مشخص کنید. مخصوصاً توی کامپایلرهای میکروکنترلرها.
      خیلی ممنونم دوست عزیز...من میخواستم قسمت صحیح اون عدد اعشاری داخل if قرار بگیره...مشکلم ا همین تبدیل انواع بود که متوجه اشتباهم شدم
      یک دنیا سپاس...
      تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

      www.intelart.ir


      ساخت کنترلر دما PID فازي با AVR [آموزشی]

      دیدگاه


        #4
        پاسخ : مشکل با قرار گیری عدد اعشاری در متغیر int

        نوشته اصلی توسط punisher.x64
        خیلی ممنونم دوست عزیز...من میخواستم قسمت صحیح اون عدد اعشاری داخل if قرار بگیره...مشکلم ا همین تبدیل انواع بود که متوجه اشتباهم شدم
        یک دنیا سپاس...
        مشکل شما از cast نیست.
        چیز دیگریه.
        ببینید اعداد ممیز شناور دقت بالایی ندارند (خلاف اون چه که همه فکر میکنن) برای همین هم ممکنه مثلا عدد شما از ۲۹.۹۸ بپره به ۳۰.۰۲ حتی وقتی شما با عددی مثل ۰.۰۱ جمع میکنید (مثال گفتم)
        دلیل خطای برنامه شما اینه که هیچ وقت این عدد (۳۰) محقق نمیشه. در یک لحظه قبلشه بعد ردش میکنه بدون این که رو خودش توقف داشته باشه.

        البته این رو حدس میزنم. شما میتونید اینو تست کنید ببینید از اینه مشکل یا چیز دیگری است.

        دیدگاه


          #5
          پاسخ : مشکل با قرار گیری عدد اعشاری در متغیر int

          نوشته اصلی توسط hamidreza.nayeri
          مشکل شما از cast نیست.
          چیز دیگریه.
          ببینید اعداد ممیز شناور دقت بالایی ندارند (خلاف اون چه که همه فکر میکنن) برای همین هم ممکنه مثلا عدد شما از 29.98 بپره به 30.02 حتی وقتی شما با عددی مثل 0.01 جمع میکنید (مثال گفتم)
          دلیل خطای برنامه شما اینه که هیچ وقت این عدد (30) محقق نمیشه. در یک لحظه قبلشه بعد ردش میکنه بدون این که رو خودش توقف داشته باشه.

          البته این رو حدس میزنم. شما میتونید اینو تست کنید ببینید از اینه مشکل یا چیز دیگری است.
          خیلی متشکرم...من میخواستم قسمت صحیح اون عدد رو مقایسه کنم...
          مگه ممکنه که 29.98 با 0.01 جمع بشه و جواب همونی ک گفتید بشه؟
          خیلی عجیب بود واسم...
          تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

          www.intelart.ir


          ساخت کنترلر دما PID فازي با AVR [آموزشی]

          دیدگاه


            #6
            پاسخ : مشکل با قرار گیری عدد اعشاری در متغیر int

            نوشته اصلی توسط punisher.x64
            خیلی متشکرم...من میخواستم قسمت صحیح اون عدد رو مقایسه کنم...
            مگه ممکنه که 29.98 با 0.01 جمع بشه و جواب همونی ک گفتید بشه؟
            خیلی عجیب بود واسم...
            خواهش

            در خصوص قسمت اول سوالتون، بله میدونم شما چی میخواستید این رو فقط من باب انتقال تجربه گفتم. گفتم در آینده حواستون باشه اعداد ممیز شناور رو اینطوری مقایسه نکنید.
            اما در مورد قسمت دوم، بله چون شما نمیتونید ۰.۱ یا ۰.۰۱ رو با جمع توانهایی از ۲ بسازید عملا اینها با نزدیک ترین عدد تقریب زده میشن بنابراین عملیات جمع با خطا همراه میشه.
            البته من ۰.۱ و ۰.۰۱ رو فقط مثال زدم شاید بشه با ممیز شناور ساختشون ولی کلیت این مسیله اینه که اکثر اعداد ممیزی رو نمیشه با ممیز شناور بدون خطا ساخت.
            اون چیزی هم که شما تو خروجی میبینید عدد گرد شده است. بنابراین اگر با ممیز شناور ۰.۱ رو ساختید فکر نکنید واقعا درون متغیر ممیز شناورتون این عدد ذخیره شده.
            این برنامه زیر رو کامپایل کنید نتیجه اش رو ببینید معلوم میشه.

            کد:
            #include <iostream>
            #include <iomanip>
            
            using namespace std;
            
            int main() {
            
            	float x = 1;
            	x /= 10;
            
            	cout << setprecision(50) << x << endl;
            
            	return 0;
            }

            دیدگاه

            لطفا صبر کنید...
            X