标头中定义的常量值会使用数学运算创建意外行为

时间:2014-05-22 08:39:26

标签: c variables math c-preprocessor

标题“main.h”定义了以下变量:

#define FRAMERATE 60.0f
#define RES_WIDTH 1920.0f
#define RES_HEIGHT 1080.0f
#define RATIO_X 16.0f
#define RATIO_Y 9.0f
#define INCH 27.0f
#define HEIGHT sqrt( pow(INCH,2.0f) / (pow((RATIO_X/RATIO_Y),2.0f) + 1.0f) ) * 2.54f
#define WIDTH (RATIO_X * HEIGHT) / RATIO_Y
#define PPCM RES_WIDTH / WIDTH
#define SEC 60.0f

问题可视化的测试代码:

float speed = 1.0f;          // Pixle / Frame

printf("SEC: %f\n", SEC);    // Frames per Second
printf("PPCM: %f\n", PPCM);  // Pixle per centimeter

printf("1. Speed (CM/SEC): %f\n", (speed * SEC) / PPCM );   // speed in cm/second
printf("2. Speed (CM/SEC): %f\n", (speed * 60.0f) / PPCM );
printf("3. Speed (CM/SEC): %f\n", (speed * SEC) / 32.121715f );
printf("4. Speed (CM/SEC): %f\n", (speed * 60.0f) / 32.121715f );

生成以下 OUTPUT

SEC:60.000000

PPCM:32.121715

1。速度(CM / SEC):0.00523

2。速度(CM / SEC):0.00523

3。速度(CM / SEC):1.867895

4。速度(CM / SEC):1.867895

问:为什么我不能用PPCM变量进行正确的数学运算?(1.和2.解决方案错误)

1 个答案:

答案 0 :(得分:5)

(speed * SEC) / PPCM将等于(speed * SEC) / RES_WIDTH / WIDTH

始终在左侧放置括号:

#define HEIGHT (sqrt( pow(INCH,2.0f) / (pow((RATIO_X/RATIO_Y),2.0f) + 1.0f) ) * 2.54f)
#define WIDTH ((RATIO_X * HEIGHT) / RATIO_Y)    
#define PPCM (RES_WIDTH / WIDTH)