奇怪的计算

时间:2010-10-03 12:44:17

标签: c++ numbers

我无法理解为什么我的程序会进行这样的计算:

#define PixelsPerMeter 40.0

// 40 pixels ~ 1 meter
#define Meters2Pixels(meters) (float)meters*PixelsPerMeter
#define Pixels2Meters(pixels) (float)pixels/PixelsPerMeter

// The speed of free falling
#define G Meters2Pixels(9.81)

// ...
float mHeight = 768;
float _windPower = Meters2Pixels(-5.0);
// ...

float x1 = ( mHeight / G ) * _windPower;

cout << "G: " << G << "; wind: " << _windPower << "\n";
cout << "Height: " << mHeight << "\n";
cout << "Calculating: " << mHeight / G * _windPower << "\n";

=>
G: 392.4; wind: -200
Height: 768
Calculating: -626300

我无法理解为什么......例如,如果我用手计算,我必须得到: 的 -391.4

怎么了?

2 个答案:

答案 0 :(得分:4)

您需要将括号中的宏展开括起来:

#define Meters2Pixels(meters) ((float)meters*PixelsPerMeter)
#define Pixels2Meters(pixels) ((float)pixels/PixelsPerMeter)

C / C ++预处理器进行盲目替换。如果没有括号,x1将被计算为:

float x1 = ( mHeight / (float)9.81*40.0 ) * _windPower;

mHeight除以9.81,然后将结果与40.0相乘。这不是你想要的。您希望将mHeight除以9.8140.0的乘积,从而得括号。

您可以使用-E的{​​{1}}选项始终查看在文件进行编译之前如何扩展宏:

g++

修改

最好也将宏参数括在括号中,如果你传递一个表达式,这将保护你(比如说g++ -Wall -E myfile.cpp

Meters2Pixels(foo + 2)

答案 1 :(得分:3)

为避免出现宏问题,您应该考虑使用内联函数。