支援浮點數的表示式求值

2021-08-19 23:45:01 字數 1750 閱讀 5728

包含加減乘除,支援括號運算,以及簡單的非法表示式判斷

原理:

只有當前操作符的優先順序高於操作符棧棧頂的操作符的優先順序,才入棧,否則彈出操作符以及運算元進行計算直至棧頂操作符的優先順序低於當前操作符,然後將當前操作符壓棧。當所有的操作符處理完畢(即操作符棧為空時),運算元棧中剩下的唯一乙個元素便是最終的表示式的值。

而操作符的優先順序為:+和-優先順序是一樣的,*和/優先順序是一樣的,+、-的優先順序低於*、/的優先順序。

不過需要注意的是在求值之前需要對表示式進行預處理,去掉空格、識別 負號(區分「-」是作為減號還是負號),提取運算元等。

這裡符號在預處理的時候用#代替

#includeusing namespace std;

const char opt = ;

string preprocess(string str)

p[j++] = str[i++];

} p[j] = '\0';

return p;

}bool isnum(string digit)

return true;

} vectorseparation(string str)

else

else

t ="";

} }if(t.size() > 0)

vectorres;

for(int i = 0; i < exp.size(); ++i)

else }

return res;}

char compare(char a, char b),,,

,,,,

}; //優先順序**

int i = 0,j = 0;

for(j = 0; j < 8; ++j)

for(i = 0; i < 8; ++i)

return table[i][j];

}bool isopt(char c)

return false;

}double calculate(stack&opdst, char opt)

else if(opt == '+')

else if(opt == '-')

else if(opt == '*')

else if(opt == '/')

}double getnum(string strnum)

bool check(string str)

return true;

}double calexpress(string str)

else

else

}optst.push(c);//把取出的c入棧 (經過前面計算,目前c優先順序大於棧頂元素);

}else }}

else if(c == "(")

else if(c == ")")

optst.pop();

}else

} while(!optst.empty())

return opdst.top();

}int main()

printf("%s = %.2lf\n\n",str.c_str(),calexpress(str));

printf("請輸入運算表示式:\n");

} return 0;

}

浮點資料和泛型表示式測試

總結 1.c規定float為4個位元組,小數點後精度為6位 2.c規定double占用8個位元組,至少精確到小數點後13位 3.long double在32位系統和64位系統中均占用16個位元組 4.佔4位元組或者8位元組,不同系統實現不同 5.bool型別在系統中其實是int型別 6.字元型資料其...

2 6 精確表達浮點數

任何乙個無限迴圈小數或有限小數都可以表示為分數的形式。1 有限小數 假設為a.b1b2b3b4b5 我們可以表示為 a b1b2b3b4b5 10 5 2 無限迴圈小數 假設為a.b1b2b3b4b5b6 c1c2c3c4 a.b1b2b3b4b5b6 c1c2c3c4 ab1b2b3b4b5b6....

浮點數的儲存以及 浮點數的比較

浮點數的儲存採用的是近似的原理 float儲存格式為 s e m 1位符號位 8位指數 23位尾數 轉成數值即為 v 1 s 1.m 2 e 127 對於16.5轉成二進位制為00010000.1 1.00001 2 4,那麼在記憶體的表示為 符號位 指數4 127 131 尾數 0 1000001...