2009年2月25日

UNIX环境下的简易计算器bc

(From ncu.edu.tw,for own reference,it's a good smart tool instead of windows calculator)

bc     # 就是 basic calculator 的縮寫

就進入一個簡易的計算器,使用方法很直覺,但是它只能做整數計算,所以要小心,例如 2/3 會計算出來 0。因為它只取整數輸出。 bc 接受十進制的數字,能做以下六種基本運算:
加 +     減 -     乘 *     除 /     餘數 %     次方 ^
您只要輸入計算指令,然後按 Enter,bc 就會回應結果,例如
1+1
2
37/7
5
37%7
2
最後,按 Ctrl+D 離開 bc 程式。

加一個指令參數,如下

bc -l
則令 bc 以小數點下有 20 位的數值做計算,而且增加了一些科學計算的功能。但是,求餘的 % 符號不再管用。例如
1+1
2
37/7
5.28571428571428571428
37%7
.00000000000000000004
也是以 Ctrl+D 結束程式。增加的科學計算功能,有
平方根 sqrt()     sine s()     cosine c()     exp e()     自然對數 l()     arctangent a()
例如
sqrt(2)
1.41421356237309504880
s(3.14159)
.00000265358979323534
c(3.14159)
-.99999999999647923060
e(1)
2.71828182845904523536
l(2.71828)
.99999932734728200315
a(1)*4
3.14159265358979323844

其實 bc 和 bc -l 都是建構在另一個更基本的工具之上: dc (desk calculator)。這個計算器採用後運算 (postfix operation) 符號,而且使用者可以自訂進位制和有效數字位數,還可以為它寫頗為複雜的程式。我們將不會在此教材中詳述這個工具。


以下是非標準 UNIX 工具。中大數學系的 UNIX 系統有安裝。

一個比較簡單一點兒的後運算計算器是 pcalc (postfix calculator)。我們不在此詳述後運算的道理,讀者在將來學習程式語言或資料結構的時候,必然會遇到這個課題。此處只是舉例。下指令

pcalc
就會進入 pcalc 的計算環境。所謂後運算,就是每當出現一個計算符號的時候,此符號視情況作用在前面一個或兩個數值上。這兩個數值,可以是以數目字寫出來的常數,也可以是另外一個計算符號的結果。計算的順序嚴格地由左而右,不需要括號也可以唯一定義計算順序。以下是一些例子。
1 1 +
2
37 7 /
5.2857143
1 2 3 4 5 * + * +
47
以上最後一個式子,相對應的中位計算符號 (infix operator) 就是 1 + 2*(3 + 4*5) 。在 pcalc 中輸入指令 ? 就會看到簡短的提示訊息,按 Ctrl+D 離開 pcalc 程式。

習題

  1. 請將以下的後計算式,寫成中位計算式。

    1 2 3 4 5 + - * /

  2. 請將以下的 bc -l 指令計算式,寫成 pcalc 的指令計算式。

    (1 + 2.5^2) / sqrt(1 + 3*2.5)


Full Text

2009年1月30日

金融危机后的大公司LOGO

Received the following mail. i think it is cool

The 2008 crash is probably the most serious economic crisis we have faced after the Great Depression. Stock markets from around the world fell as much as 20% in a single week, dozens of banks either failed or were rescued by government and private instutitions, and companies started laying off employees as a consequence of the reduced demand.

We know how we entered into the crisis, but we don’t how, when, or how we will be getting out of it. Considering that issue, we decided to our little bit to help cheer everyone up by redoing the logos of some renowned companies …. after the crisis.
















Full Text

2009年1月26日

First conference call

初二早上

牙买加同志的英语确实很难懂,还要有个nice的mm(maybe jj)能够有时候翻译一下,普通的American English听起来倒是没有问题,继续努力。


Full Text

2009年1月24日

过年之前,正月29

三天前的中午一个人来到杭州,三天后的下午5:27,下班之前记下这个日子。

Happy New Year to my friends

Happy New Year to myself


Full Text

2008年11月5日

双线性内插值法简单实现

图像缩放有几种常见的算法:最邻近插值(近邻取样法)、双线性内插值和三次卷积法,从得到的图像质量来说分别从低到高,从耗费的时间来看是从少到多。

Windows系统的函数StretchDIBits采用的是最邻近插值法,其运算速度最快,不过得到的图像质量也是惨不忍睹,下面是个对比:

frame_3.jpg2.JPG

原始图片为手机拍摄,size为320X240,右边是用windows自带的StretchDIBits放大两倍的结果,左边是采用双线性内插值法缩放的结果,注意观察图像中有斜线条的地方,最邻近插值法明显看到大量锯齿,而双线性内插值法则有效的消除了这些锯齿的产生。下面是转换函数代码,src为输入RGB数据(24位色),width和height为原始宽高,dest为输出的2倍大小的RGB数据。

void resize_rgbbuf(unsigned char * dest,unsigned char * src,int width,int height)
{
int sw = width - 1, sh = height - 1, dw = width*2 - 1, dh = height*2 - 1;

int B, N, x, y;
int nPixelSize = 3; // 24 color,3 bytes each pixel
BYTE * pLinePrev, *pLineNext;
BYTE * pDest;
BYTE * pA, *pB, *pC, *pD;


for ( int i = 0; i <= dh; ++i )
{
pDest = ( BYTE * )dest+i*width*2*3;
y = i * sh / dh;
N = dh - i * sh % dh;

pLinePrev = ( BYTE * )src+y*width*3;
y++;
pLineNext = ( N == dh ) ? pLinePrev : ( BYTE * )src+y*width*3;

for ( int j = 0; j <= dw; ++j )
{
x = j * sw / dw * nPixelSize;
B = dw - j * sw % dw;
pA = pLinePrev + x;
pB = pA + nPixelSize;
pC = pLineNext + x;
pD = pC + nPixelSize;
if ( B == dw )
{
pB = pA;
pD = pC;
}

for ( int k = 0; k < nPixelSize; ++k )
*pDest++ = ( BYTE )( int )(
( B * N * ( *pA++ - *pB - *pC + *pD ) + dw * N * *pB++
+ dh * B * *pC++ + ( dw * dh - dh * B - dw * N ) * *pD++
+ dw * dh / 2 ) / ( dw * dh )
);
}
}
return;

}


Full Text