اطلاعیه

Collapse
No announcement yet.

ضرب اعداد بزرگ در میکرو های 8بیتی

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

    ضرب اعداد بزرگ در میکرو های 8بیتی

    سلام
    من دارم تبدیل تاریخ میلادی به شمسی می نویسم. تو برنامه نیاز دارم تا چند تا عدد بزرگ در هم ضرب کنم.متغیری هم که برای اینکار استفاده میکنم long هست
    من ضرب رو انجام میدم ولی جواب صحیح به من نمیده.(از کدویژن استفاده میکنم و میکرو mega32 دارم)
    لطفا کمک کنید!

    #2
    پاسخ : ضرب اعداد بزرگ در میکرو های 8بیتی

    کد های پروژت رو بزار...
    اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

    اگه دوس دارید سریع به جواب برسید :
    1) قبل از پرسیدن سوال، بسرچید.
    2) سوالاتون رو با جزئیات کامل مطرح کنید.

    دیدگاه


      #3
      پاسخ : ضرب اعداد بزرگ در میکرو های 8بیتی

      نوشته اصلی توسط MSThrax
      سلام
      من دارم تبدیل تاریخ میلادی به شمسی می نویسم. تو برنامه نیاز دارم تا چند تا عدد بزرگ در هم ضرب کنم.متغیری هم که برای اینکار استفاده میکنم long هست
      من ضرب رو انجام میدم ولی جواب صحیح به من نمیده.(از کدویژن استفاده میکنم و میکرو mega32 دارم)
      لطفا کمک کنید!
      خب چقدر بزرگ؟ توی چند بیت جا میگیره عدد حاصل ضرب شما؟ خودتوی دستی حساب کنید، بعد تبدیل به باینری کنید ببینید چند بیت میخواد.
      انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

      دیدگاه


        #4
        پاسخ : ضرب اعداد بزرگ در میکرو های 8بیتی

        ضربی که نوشتی را بذار و نوع متغیر ها را هم بنویس
        امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

        دیدگاه


          #5
          پاسخ : ضرب اعداد بزرگ در میکرو های 8بیتی

          ممنون که سریع جواب دادید
          این برنامه:
          فک کنم همه چیز واضح باشه،اگر ابهامی بود بگید که بگم
          در جواب hamedtaran
          باید یگم که حدود 700000 تا 800000 میشه که توی اینتیجر جا نمیشه
          حدود دو بایت و نصفی می خواد


          void MiladiToShamsi(unsigned char* ShDate, unsigned char* ShMonth, unsigned int* ShYear,unsigned char date,unsigned char month,unsigned int year)
          {
          char buff[20];

          unsigned long TotalDays;
          int temp2, temp3, KabiseNo;
          long temp1;
          int intY = year + 2000;
          unsigned char tempShMonth, tempShYear;

          temp2 = month - 1;

          switch (temp2)
          {

          case 1:
          temp2 *= 31;
          break;

          case 2:
          //temp3 = intY % 4;
          if((intY % 4 == 0 & intY % 100 != 0) | intY % 400 ==0) //Checking for leap year
          temp2 *= 29;
          else
          temp2 *= 28;
          break;

          case 3:
          temp2 *= 31;
          break;

          case 4:
          temp2 *= 30;
          break;

          case 5:
          temp2 *= 31;
          break;

          case 6:
          temp2 *= 30;
          break;

          case 7:
          temp2 *= 31;
          break;

          case 8:
          temp2 *= 31;
          break;

          case 9:
          temp2 *= 30;
          break;

          case 10:
          temp2 *= 31;
          break;

          case 11:
          temp2 *= 30;
          break;

          case 12:
          temp2 *= 31;
          break;

          };

          TotalDays = ((intY - 1) * 365) + ((intY - 1) / 4) + temp2 + date; //***** inja manzurame,zarbe 365 * (intY - 1)
          temp1 = intY*365;
          if(temp1 == 734745){
          //sprintf(buff,);
          lcd_gotoxy(6,0);
          lcd_puts("OK"
          }
          //strcpyf(buff,
          //lcd_gotoxy(6,0);
          //lcd_puts(buff);
          delay_ms(2000);

          TotalDays -= 226899;

          // tempShYear = TotalDays / 365; //Calculaing not-accurate final year value
          // temp1 = tempShYear / 4; //Calculaing past leap years
          // TotalDays -= temp1; //Substracting days of leap years from totla days
          // tempShYear = (TotalDays / 365) + 1; //Calculaing accurate final year value
          // TotalDays = TotalDays % 365; //remaining days of inside of the year

          tempShYear = 0;
          while(TotalDays >= 366)
          {

          KabiseNo = tempShYear % 4;

          if(KabiseNo == 0)
          TotalDays -= 366;
          else
          TotalDays -= 365;

          tempShYear++;

          }

          tempShMonth = 1;

          while(TotalDays >= 32)
          {
          if(tempShMonth <= 6) //From Farvardin to Shahrivar counts 31 days
          TotalDays - 31;
          else
          TotalDays - 30; //From Mehr to Esfand counts 30 days

          tempShMonth++;

          }

          *ShDate = TotalDays;
          *ShMonth = tempShMonth;
          *ShYear = tempShYear;

          }

          دیدگاه


            #6
            پاسخ : ضرب اعداد بزرگ در میکرو های 8بیتی

            سلام نباید مشکلی داشته باشه چون long int تا منفی و مثبت 2147483647 کار میکنه و اگر هم عدد منفی نداری از unsigned long int استفاده کن تا عدد 4294967295 جواب میده .
            باد می وزد ...
            میتوانی در مقابلش هم دیوار بسازی ، هم آسیاب بادی
            تصمیم با تو است ...

            دیدگاه


              #7
              پاسخ : ضرب اعداد بزرگ در میکرو های 8بیتی

              ممکنه کدویژنتون کرکش نامعتبره!
              1 در دنیا 100 در آخرت (درس و مشق فعالیتمو تو انجمن کم کرده)
              من آنچه شرط بلاغست با تو میآ‌گویم. تو خواه از سخنم پند گیر و خواه ملال. سعدی
              !Electronic On! Programming On
              هوشمندانه سوال بپرسیم!
              http://ir02x6.persiangig.com/logo/eca/tanks_01.png

              دیدگاه


                #8
                پاسخ : ضرب اعداد بزرگ در میکرو های 8بیتی

                فک کنم MahanRafie
                راس میگه.من از همون کرک های معمولی رایج استفاده میکنم. ضمن اینکه خودم میدونستم long جواب میده، مشکل اینه که انجام نمیده
                دوستان نگا کنید ببینید مشکلی تو کد ها نیس؟ بنظرم که نیس ، حالا شما هم نیگا کنید

                دیدگاه


                  #9
                  پاسخ : ضرب اعداد بزرگ در میکرو های 8بیتی

                  سلام اینم کد تبدیل شمسی به میلادی و میلادی به شمسی. هم توی کدویژن جواب میده و هم توی کامپایلر gcc یا همون Atmel Studio.
                  یک structure به اسم Date نوشتم که توش ماه و سال و روز رو نگهداری میکنه. تابع ShamsiToMiladi برای تبدیل تاریخ شمسی به میلادی و تابع MiladiToShamsi هم برای تبدیل تابع میلادی به شمسی استفاده میشه. خروجی دوتاش هم همون structure هست که توضیح دادم. سوالی بود در خدمتم.
                  داخل تابع main هم یه مثال تبدیل تاریخ براتون گذاشتم. :redface:
                  کد:
                  
                  /*****************************************************
                        Shamsi to Miladi and Miladi to Shamsi
                  Author : Astronomer Hamid Zare  
                  
                  Chip type        : ATmega32A
                  Program type      : Application
                  AVR Core Clock frequency: 8.000000 MHz
                  Memory model      : Small
                  External RAM size    : 0
                  Data Stack size     : 512
                  *****************************************************/
                  
                  #define true 1
                  #define false 0
                  
                  typedef struct _Date
                  {
                    int     iYear;
                    int     iMonth;
                    int     iDay;
                  }Date;
                  
                  int MiladiIsLeap(int miladiYear);
                  Date ShamsiToMiladi(int ShamsiMonth,int ShamsiDay,int ShamsiYear);
                  Date MiladiToShamsi(int iMiladiMonth,int iMiladiDay,int iMiladiYear);
                  
                  
                  
                  Date ShamsiToMiladi(int ShamsiMonth,int ShamsiDay,int ShamsiYear)
                  {
                  
                    Date  miladiDate;
                    int      marchDayDiff, remainDay;
                    int      dayCount, miladiYear, i;
                    
                  
                    // this buffer has day count of Miladi month from April to January for a none year.
                  
                    int miladiMonth[12] = {30,31,30,31,31,30,31,30,31,31,28,31};
                    miladiYear = ShamsiYear + 621;
                  
                    //Detemining the Farvardin the First
                  
                    if(MiladiIsLeap(miladiYear))
                    {
                      //this is a Miladi leap year so Shamsi is leap too so the 1st of Farvardin is March 20 (3/20)
                      marchDayDiff = 12;
                    }
                    else
                    {
                      //this is not a Miladi leap year so Shamsi is not leap too so the 1st of Farvardin is March 21 (3/21)
                      marchDayDiff = 11;
                    }
                  
                    // If next year is leap we will add one day to Feb.
                    if(MiladiIsLeap(miladiYear+1))
                    {
                      miladiMonth[10] = miladiMonth[10] + 1; //Adding one day to Feb
                    }
                  
                    //Calculate the day count for input shamsi date from 1st Farvadin
                  
                    if((ShamsiMonth>=1)&&( ShamsiMonth<=6))
                    dayCount = ((ShamsiMonth-1) * 31) + ShamsiDay;
                    else
                    dayCount =(6 * 31) + ((ShamsiMonth - 7) * 30) + ShamsiDay;
                  
                    //Finding the correspond miladi month and day
                  
                    if (dayCount <= marchDayDiff) //So we are in 20(for leap year) or 21for none leap year) to 31 march
                    {
                      miladiDate.iDay = dayCount + (31 - marchDayDiff);
                      miladiDate.iMonth = 3;
                      miladiDate.iYear=miladiYear;
                    }
                    else
                  
                    {
                      remainDay = dayCount - marchDayDiff;
                  
                  
                      i = 0; //starting from April
                  
                      while ((remainDay > miladiMonth[i]))
                      {
                        remainDay = remainDay - miladiMonth[i];
                        i++;
                      }
                      miladiDate.iDay = remainDay;
                  
                      if (i > 8) // We are in the next Miladi Year
                      {
                        miladiDate.iMonth = i - 8;
                        miladiDate.iYear = miladiYear + 1;
                      }
                      else
                      {
                        miladiDate.iMonth = i + 4;
                        miladiDate.iYear = miladiYear;
                      }
                  
                    }
                  
                    return miladiDate;
                  }
                  
                  
                  Date MiladiToShamsi(int iMiladiMonth,int iMiladiDay,int iMiladiYear)
                  {
                  
                    int shamsiDay, shamsiMonth, shamsiYear;
                    int dayCount,farvardinDayDiff,deyDayDiff ;
                    int sumDayMiladiMonth[] = {0,31,59,90,120,151,181,212,243,273,304,334};
                    int sumDayMiladiMonthLeap[]= {0,31,60,91,121,152,182,213,244,274,305,335};
                    Date shamsidate;
                  
                    farvardinDayDiff=79;
                  
                    if (MiladiIsLeap(iMiladiYear))
                    {
                      dayCount = sumDayMiladiMonthLeap[iMiladiMonth-1] + iMiladiDay;
                    }
                    else
                    {
                      dayCount = sumDayMiladiMonth[iMiladiMonth-1] + iMiladiDay;
                    }
                    if((MiladiIsLeap(iMiladiYear - 1)))
                    {
                      deyDayDiff = 11;
                    }
                    else
                    {
                      deyDayDiff = 10;
                    }
                    if (dayCount > farvardinDayDiff)
                    {
                      dayCount = dayCount - farvardinDayDiff;
                      if (dayCount <= 186)
                      {
                        switch (dayCount%31)
                        {
                          case 0:
                          shamsiMonth = dayCount / 31;
                          shamsiDay = 31;
                          break;
                          default:
                          shamsiMonth = (dayCount / 31) + 1;
                          shamsiDay = (dayCount%31);
                          break;
                        }
                        shamsiYear = iMiladiYear - 621;
                      }
                      else
                      {
                        dayCount = dayCount - 186;
                        switch (dayCount%30)
                        {
                          case 0:
                          shamsiMonth = (dayCount / 30) + 6;
                          shamsiDay = 30;
                          break;
                          default:
                          shamsiMonth = (dayCount / 30) + 7;
                          shamsiDay = (dayCount%30);
                          break;
                        }
                        shamsiYear = iMiladiYear - 621;
                      }
                    }
                    else
                    {
                      dayCount = dayCount + deyDayDiff;
                  
                  		switch (dayCount%30)
                  		{
                  			case 0 :
                  			shamsiMonth = (dayCount / 30) + 9;
                  			shamsiDay = 30;
                  			break;
                  			default:
                  			shamsiMonth = (dayCount / 30) + 10;
                  			shamsiDay = (dayCount%30);
                  			break;
                  		}
                  		shamsiYear = iMiladiYear - 622;
                  
                  	}
                  	shamsidate.iYear = shamsiYear;
                  	shamsidate.iMonth = shamsiMonth;
                  	shamsidate.iDay = shamsiDay;
                  
                  	return shamsidate ;
                  }
                  // the function check a miladiyear is leap or not.
                  int MiladiIsLeap(int miladiYear)
                  {
                  	if(((miladiYear % 100)!= 0 && (miladiYear % 4) == 0) || ((miladiYear % 100)== 0 && (miladiYear % 400) == 0))
                  	return true;
                  	else
                  	return false;
                  }
                  
                  void main(void)
                  {
                     Date shamsiDate;
                     int year = 2014;
                     int month = 8;
                     int day = 10;
                     
                     shamsiDate = MiladiToShamsi(month,day,year);
                     
                     
                     
                     
                  while (1)
                     {
                     
                  
                     }
                  }
                  اللهم صل علی محمد و ال محمد و عجل فرجهم
                  >>> www.DMF313.ir <<<
                  اگر ژرف یابی و پژوهش نباشد; نتیجه اش یک جا ایستادن،
                  در جا زدن و با دنیای پیرامون خود به تدریج بیگانه تر شدن
                  است.

                  دیدگاه


                    #10
                    پاسخ : ضرب اعداد بزرگ در میکرو های 8بیتی

                    با تشکر این پروژه توی ماههای 31 روزه درست کار نمیکنه

                    دیدگاه


                      #11
                      پاسخ : ضرب اعداد بزرگ در میکرو های 8بیتی

                      دستت درد نکنه
                      لطف میکنی که روش محاسبه ات رو بگی؟(کدها یکم زیاده و یکم واسه من نامفهوم) میخوام با ماله خودم مقایسه کنم
                      ضمن اینکه من میخوام بدونم که چرا عمل ضرب رو نمیتونم انجام بدم جدا از این موضوع
                      ممنون

                      دیدگاه


                        #12
                        پاسخ : ضرب اعداد بزرگ در میکرو های 8بیتی

                        باید نوع داده رو تغییر بدی

                        دیدگاه

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