#define HARMONIC_MEAN(X, Y) ( 1/((1/X+1/Y) / 2) )
int main() {
printf("%g\n", HARMONIC_MEAN(2, 3)); // 編譯錯誤:divide by zero
}
宏展開後為整數運算:
1 / ((1/2 + 1/3) / 2)
→ 1 / ((0 + 0) / 2) // 整數除法截斷為 0
→ 1 / 0 // 除零錯誤
#define HARMONIC_MEAN(X, Y) ( 1.0 / ((1.0/(X) + 1.0/(Y)) / 2.0) )
int main() {
printf("%f\n", HARMONIC_MEAN(2, 3)); // 輸出 2.400000
return 0;
}
1.0、2.0 等浮點常數,編譯器將整個運算提升為 double。X、Y 建議加括號 (X)、(Y),防止傳入運算式時優先級錯誤。inline 函數或模板(C++),更安全可除錯。// C++ 模板版
template <typename T>
T harmonic_mean(T x, T y) {
return 2 * x * y / (x + y); // 代數等價形式,避免巢狀除法
}
記住:宏只是文字替換,型別由使用處決定,涉及除法務必確保至少一個運算元為浮點數。