《程式設計原本 》一3 4 處理特殊情況的過程

2021-09-23 09:33:07 字數 1630 閱讀 8789

在上面的最後版本裡用到下面運算:

n / i(2)

n % i(2) == i(0)

n % i(2) != i(0)

n == i(0)

n == i(1)

其中/和%的代價很高.對無符號整數或有符號整數的非負值,可以用移位和掩碼運算來代替它們.

識別出程式裡經常出現的表示式,其中涉及一些過程或某種型別的常量.將它們定義為相應的特殊情況過程常常很有價值.針對特殊情況的實現經常比一般情況的處理更高效,因此應該把這類過程放入型別的計算基.對語言的內部型別,通常存在針對特殊情況的機器指令.對使用者定義型別,針對特殊情況的優化也常有顯著效果.舉例說,兩個任意多項式的除法比乙個多項式除以x難得多.與此類似,兩個高斯整數(形式為a+bi的數,其中a和b都是整數而i=√.1)相除比乙個高斯整數除以1+i難得多.

任何整數型別都應該提供下面的特殊情況過程:

練習3.2請為c++的各整數型別實現上面這些過程.

現在可以給出求冪過程的最後實現了,其中用到一些特殊情況過程:

templaterequires(integer(i) && binaryoperation(op)) 

domain(op) power accumulate positive(domain(op) r,

domain(op) a, i n,

op op)

a = op(a, a);

n = half nonnegative(n);

} }

templaterequires(integer(i) && binaryoperation(op)) domain(op) power accumulate(domain(op) r, domain(op) a, i n, op op)

templaterequires(integer(i) && binaryoperation(op)) domain(op) power(domain(op) a, i n, op op)

n = half nonnegative(n);

if (zero(n)) return a;

return power accumulate positive(a, op(a, a), n, op); }

由於已知a n+m = a n a m , 表示式a 0 必須求出運算op的單位元.可以把單位元作為操作的另一引數傳入,將power的定義擴充到包括0次冪:6

templaterequires(integer(i) && binaryoperation(op)) 

domain(op) power(domain(op) a, i n, op op, domain(op) id)

專案3.1浮點乘法和加法不可結合,用於作為power或powerleftassociated的運算就可能得到不同結果.請設法弄清,在求浮點數的整數次冪時,是power還是powerleftassociated能給出更準確的結果.

統一處理異常

1.controlleradvice 註解定義全域性異常處理類 controlleradvice public class globalexceptionhandler 2.exceptionhandler 註解宣告異常處理方法,註解的方法的引數列表裡,還可以宣告很多種型別的引數 controlle...

Web應用架構 錯誤統一處理, 和事務統一處理

因為前期,重點放在業務分析上,這兩塊一直認真思考過,覺得很簡單.一開始只是找了乙個nhibernate的示例,就決定把session的open和close和事務 transaction 的commit,放在httpmodule中處理.算是session per request的模式.之後,繼續加入錯...

Web應用架構 錯誤統一處理, 和事務統一處理

因為前期,重點放在業務分析上,這兩塊一直認真思考過,覺得很簡單.一開始只是找了乙個nhibernate的示例,就決定把session的open和close和事務 transaction 的commit,放在httpmodule中處理.算是session per request的模式.之後,繼續加入錯...