Странный расчет - PullRequest
       3

Странный расчет

0 голосов
/ 03 октября 2010

Я не могу понять, почему моя программа выполняет такие вычисления:

#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 ]

4 голосов
/ 03 октября 2010

Вы должны заключить расширения макросов в круглые скобки как:

#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.81 и 40.0, отсюда и скобки.

вы всегда можете увидеть, как ваши макросы расширяются до того, как ваш файл отправляется на компиляцию, используя параметр -E g++ как:

g++ -Wall -E myfile.cpp 

EDIT:

Также лучше заключить параметр макроса в круглые скобки, это защитит вас, если вы передадите выражение (например, скажем Meters2Pixels(foo + 2):

#define Meters2Pixels(meters) ((float)(meters)*PixelsPerMeter)
#define Pixels2Meters(pixels) ((float)(pixels)/PixelsPerMeter)
3 голосов
/ 03 октября 2010

Чтобы избежать проблем с макросами, вы должны рассмотреть использование встроенных функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...