ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 6 از 6
  1. #1
    2013/09/03
    1,984
    633

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

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

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

  2. #2
    2012/07/21
    834
    23

    پاسخ : مشکل با قرار گيري عدد اعشاري در متغير 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. #3
    2013/09/03
    1,984
    633

    پاسخ : مشکل با قرار گيري عدد اعشاري در متغير 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 قرار بگيره...مشکلم ا همين تبديل انواع بود که متوجه اشتباهم شدم
    يک دنيا سپاس...
    قانون سوم نیوتون میگه برای اینکه بخوای به چیزی برسی باید از یه چیزی دل بکنی...

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

  4. #4
    2009/10/25
    تهران
    414
    24

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

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

    البته این رو حدس میزنم. شما میتونید اینو تست کنید ببینید از اینه مشکل یا چیز دیگری است.
  5. #5
    2013/09/03
    1,984
    633

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

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

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

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

  6. #6
    2009/10/25
    تهران
    414
    24

    پاسخ : مشکل با قرار گيري عدد اعشاري در متغير 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;
    }
نمایش نتایج: از 1 به 6 از 6

موضوعات مشابه

  1. محل قرار گيري smt160 فلزي در مخزن
    توسط 138523 در انجمن ابزار دقیق
    پاسخ: 6
    آخرين نوشته: 2015/02/28, 20:29
  2. محل قرار گيري smt160 فلزي
    توسط 138523 در انجمن میکروکنترلرهای AVR
    پاسخ: 0
    آخرين نوشته: 2015/02/19, 13:58
  3. مشکل براي ايجاد متغير 32 بيتي - مشکل سرريز يک متغير
    توسط amirna3r در انجمن میکروکنترلرهای AVR
    پاسخ: 18
    آخرين نوشته: 2014/12/12, 11:00
  4. روش طراحي و محل قرار گيري BTS
    توسط mohsenavr در انجمن سیستمهای مخابراتی
    پاسخ: 6
    آخرين نوشته: 2014/03/15, 13:23
  5. نحوه قرار گيري atmega8 در پروگرمر STK200/300
    توسط dani222 در انجمن میکروکنترلرهای AVR
    پاسخ: 9
    آخرين نوشته: 2011/04/24, 10:49

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •