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

Jan*_*Jan 2 c math variables 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
Run Code Online (Sandbox Code Playgroud)

问题可视化的测试代码:

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 );
Run Code Online (Sandbox Code Playgroud)

生成以下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.解决方案是错误的)

use*_*733 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)
Run Code Online (Sandbox Code Playgroud)