導航:首頁 > 操作系統 > 單片機小數

單片機小數

發布時間:2022-01-17 06:19:26

㈠ 誰知道匯編語言(單片機)是如何定義浮點小數負數

單片機的專長在控制方面,以布爾運算為主;難得碰到較大的數值運算。

即使碰上,也是用整數進行運算,只是在顯示的時候,把小數點和正負號顯示在合適的位置即可。

㈡ 51單片機帶小數的多位元組乘除運算

對於多位元組數,估計你不會直接保存成數值而是要保存成字元串了吧,當然如果你保存成數值的話通過連續乘10直到結果為整數的方法計算小數點後的位數,對於小數相乘來說,兩個數的小數點位數相加就是結果的小數點位數。數值計算可以全當整數,按大數乘法計算。而除法可以通過同時向後移位小數位到全部都是整數,用大數除法的演算法解決。如果存的是數值,直接連續乘10.
附,大數計算,這個是在電腦上編的,不過都是C語言,可以參考,有不懂可以問我。
#include <stdio.h>#include <string.h>
//-----------------------------------------------//將字元串轉化為整形數組void str2int(char *a,char *b,int ia[1024],int ib[1024],int ir[1024]){ int i,len; //對數組初始化 for (i=0;i<1024;i++) { ia[i]=0; ib[i]=0; ir[i]=0; } //將a翻轉後輸入到數組 i=strlen(a); len=strlen(a); while(i) { i--; ia[len-i-1]=*(a+i)-48; } //將b翻轉後輸入到數組 i=strlen(b); len=strlen(b); while(i) { i--; ib[len-i-1]=*(b+i)-48; }}//-----------------------------------------------//比較大小int cmp(char *a,char *b){ int i,sg; if (strlen(a)>strlen(b)) { sg=0; } else if (strlen(a)<strlen(b)) { sg=1; } else { for (i=0;i<(int)strlen(a);i++) { if (*(a+i)>*(b+i)) { sg=0; break; } else if (*(a+i)<*(b+i)) { sg=1; break; } else sg=0; } } return sg;}//-----------------------------------------------//加法函數char *add(char *a,char *b){ int len,i,c; int ia[1024],ib[1024],ir[1024]; str2int(a,b,ia,ib,ir); if (strlen(a)>strlen(b)) len=strlen(a); else len=strlen(b); c=0; //加法運算 for (i=0;i<len;i++) { ir[i]=(ia[i]+ib[i]+c)%10; c=(ia[i]+ib[i]+c)/10; } if (c==1) { ir[len]=1; len++; } for (i=0;i<len;i++) { *(a+i)=ir[len-i-1]+48;//翻轉輸出 } *(a+len)='\0'; return a;}//-----------------------------------------------//減法函數char *sub(char *a,char *b){ int len,i,c,sg; int ia[1024],ib[1024],ir[1024]; char str[1024]; char *strrt; str2int(a,b,ia,ib,ir); //符號判斷 sg=cmp(a,b); if (sg==0) len=strlen(a); else len=strlen(b); c=0; //減法運算 for (i=0;i<len;i++) { if (sg==0) { if ((ia[i]-ib[i]-c)>=0) { ir[i]=ia[i]-ib[i]-c; c=0; } else { ir[i]=10+ia[i]-ib[i]-c; c=1; } } else { if ((ib[i]-ia[i]-c)>=0) { ir[i]=ib[i]-ia[i]-c; c=0; } else { ir[i]=10+ib[i]-ia[i]-c; c=1; } } } if (sg==1) str[0]='-'; for (i=0;i<len;i++) { str[i+sg]=ir[len-i-1]+48;//翻轉輸出 } str[len+sg]='\0'; strrt=str; //去零處理 if (sg==0) { while(len>1&&*strrt=='0') { strrt++; len--; } } if (sg==1) { strrt++; while(len>1&&*strrt=='0') { *strrt='-'; strrt++; len--; } strrt--; } strcpy(a,strrt); return a;}
//-----------------------------------------------//乘法函數char *mul(char *a,char *b){ int len,lena,lenb,i,j,c,jin; int ma[1024],mb[1024],mr[1024]; char stra[1024],strb[1024]; char *strrta,*strrtb; stra[0]='0'; stra[1]='\0'; strrta=stra; str2int(a,b,ma,mb,mr); //乘法運算 lena=strlen(a); lenb=strlen(b); for (j=0;j<lena;j++) { c=0; jin=0; for (i=0;i<lenb;i++) { mr[i]=(ma[j]*mb[i]+c)%10; c=(ma[j]*mb[i]+c)/10; } len=lenb; if (c>0) { strb[0]=c+48; jin=1; } for (i=0;i<len;i++) { strb[i+jin]=mr[len-i-1]+48; } for (i=len;i<len+j;i++) strb[i+jin]='0'; strb[len+j+jin]='\0'; strrtb=strb; add(strrta,strrtb); } strcpy(a,strrta); return a;}//--------------------------------------------------//除法函數char *div(char *a,char *b){ int len,lena,i,j; char stra[1024],strb[1024],strc[1024],strd[1024]; char *strbp; strbp=strc; strcpy(stra,a); strcpy(strb,b); strcpy(strd,a); if (cmp(stra,strb)==1) { //被除數小於除數 *a='0'; *(a+1)='\0'; strcpy(b,stra); } else { //被除數大於除數 mul(strb,"10"); len=strlen(a)-strlen(b); if (len==0||(len==1&&cmp(stra,strb)==1)) { strcpy(stra,a); strcpy(strb,b); i=1; strc[0]='1'; strc[1]='\0'; while(cmp(stra,strc)==0) { strc[0]=i+48; strc[1]='\0'; mul(strc,strb); i++; } *a=i+46; *(a+1)='\0'; strcpy(strc,a); mul(strc,strb); sub(stra,strc); strcpy(b,stra); } else { len=strlen(a)-strlen(b); for (j=0;j<=len;j++) { for (i=0;i<=(int)strlen(b);i++) { if ((i+j-1)<0) stra[i]='0'; else stra[i]=*(a+i+j-1); } stra[strlen(b)+1]='\0'; strcpy(strb,b); strbp=stra; lena=strlen(strbp); while(lena>1&&*strbp=='0') { strbp++; lena--; } div(strbp,strb); strc[j]=*strbp; strbp=strb; for (i=0;i<(int)(strlen(b)-strlen(strb));i++) { strbp--; *strbp='0'; } for (i=strlen(b)-1;i>=0;i--) { *(a+i+j)=*(strbp+i); } } strc[len+1]='\0'; strbp=strc; lena=strlen(strbp); while(lena>1&&*strbp=='0') { strbp++; lena--; } strcpy(a,strbp); mul(strbp,b); sub(strd,strbp); strcpy(b,strd); } } return a;}
void main(){ char a[1024],b[1024],c; c='0'; while(c!='q') { printf(">>請輸入命令\n>>+ 加\n>>- 減\n>>* 乘\n>>/ 除\n>>q 退出\n>>"); c=getchar(); getchar(); switch(c) { case 'q':break; case '+': printf(">>請輸入第一個加數\n>>"); gets(a); printf(">>請輸入第二個加數\n>>"); gets(b); printf(">>和為%s",add(a,b)); getchar(); break; case '-': printf(">>請輸入被減數\n>>"); gets(a); printf(">>請輸入減數\n>>"); gets(b); printf(">>差為%s",sub(a,b)); getchar(); break; case '*': printf(">>請輸入第一個乘數\n>>"); gets(a); printf(">>請輸入第二個乘數\n>>"); gets(b); printf(">>積為%s",mul(a,b)); getchar(); break; case '/': printf(">>請輸入被除數\n>>"); gets(a); printf(">>請輸入除數\n>>"); gets(b); div(a,b); printf(">>商為%s余數為%s",a,b); getchar(); break; default:break; } }}

㈢ 單片機C語言顯示小數

你放大100被 , 計算出的 值就是487了 ,然後顯示在數碼管上,小數點顯示在固定的位置

㈣ 單片機 程序中能輸入小數嗎

這樣程序處理的也簡單、2,比如輸入1、5就可以、4.0245,還是逐位輸入的好、0不用用小數表示,否則處理小數的程序都會讓你吃不消,就逐位輸入1

㈤ 單片機進行浮點運算時,小數點後面的數據在哪裡

ng 'give up and come

㈥ 關於C51單片機的小數點四捨五入處理

將你需保留的那一位的低一位加5之後舍掉即可

單片機內一般採用整數計算,如果要保留兩位小數,需將原數據擴大100倍,小數點該向左移2位
18754/100=187·54 但單片機只能算整數,因此結果只能是187
因此計算時我們我們將被除數擴大100倍 相當於小數點向右移2位,1875400/ 100=18754
然後我們將計算結果的小數點再向左移回來2 位,即變成了 187.54 這就是定點小數的演算法
如果18754/100我們只保留一位小數
我們可以這樣處理 (18754*100+500)=1875900
1875900/100=18759
小數點左移2位,結果187.59 最後一位不考慮取187.5
但如果18755/100我們只保留一位小數
(18755*100+500)=1876000
1876000/100=18760

小數點左移2位,結果187.60 最後一位不考慮取187.6
看到了吧,4捨去了 5就入上去了
所以要保留三位小數,需將原來數據擴大1000倍,再除1000
所以要保留4位小數,需將原來數據擴大10000倍,再除10000
.......
擴大100倍或1000倍操作要放在除法之前,因除法才會導致小數丟失
需4舍5 入,將要保留的那一位數的低一位加5即可
當然這是低級演算法,用C語言編程直接可以用浮點數,結果輸出 時會自動四舍5 入
你所要做的是將浮點數轉換為字元(用sprint函數)並控制輸出數據的位數,格式控制類似於printf函數

㈦ 51單片機小數點後面的數怎麼算用什麼類型的數

你的問題實質上是如何輸入小數。將鍵盤上某個鍵定義為小數點,如果檢測到這個鍵被按下,那麼後面按的數字鍵都看成小數就可以了。如,定義星號是小數點,那麼按下星號後,再按下2時,就乘以0.1,再按下4時,就乘以0.01,兩個數加起來就是0.24了

㈧ 51單片機顯示小數問題

浮點運算有精度問題,四捨五入呀,像這樣改:

if(t>=0)
a=t*100;//
else
a=(-t)*100;

改為

if(t>=0)
a=(t+0.005)*100;//
else
a=(-t+0.005)*100;

㈨ 關於單片機程序中小數點的的問題

這個要看單片機的平台以及關於舍入/進位的相關定義。
一般來說都是舍入為6。

㈩ 單片機數碼管顯示小數

我不懂你的電路圖是怎麼接的,但是數碼管的小數點是這樣的
P0=table1[ge];你這個是定址的後面加個點就得了
給為 P0=table1[ge]+0x80;或者P0=table1[ge]|0x80應該都一樣的;
0x80就是那個點亮,不懂你是公陽還是共陰的,
如果是公陽的是0x7f。。。和共陰的相反

閱讀全文

與單片機小數相關的資料

熱點內容
r11s手機管家沒有加密 瀏覽:777
怎麼看電腦連接哪個伺服器 瀏覽:189
二手伺服器設備欺詐如何解決 瀏覽:877
單片機伺服器安裝win10 瀏覽:658
胸椎壓縮性骨折傷殘 瀏覽:954
mt怎麼解壓文件 瀏覽:41
達芬奇項目伺服器有什麼用 瀏覽:854
自製怎麼捏都可以復原的解壓球 瀏覽:615
qq軟體管理怎麼加密 瀏覽:740
手機使用代碼編程器 瀏覽:939
單片機四位99秒錶製作流程圖 瀏覽:617
壓縮包軟體如何安裝 瀏覽:767
我的世界伺服器1122地址 瀏覽:5
蘋果如何與安卓系統連接伺服器 瀏覽:934
農業銀行app學生繳費怎麼切換 瀏覽:470
福建在哪個app上有安康碼 瀏覽:547
用友商貿寶t1登錄找不到加密狗 瀏覽:557
區間測速演算法不正確 瀏覽:333
appstore轉到哪個國家比較好 瀏覽:926
程序員為什麼被公司埋炸彈 瀏覽:943