在表达式中使用定义时结果不正确

-1 c macros

数量级不正确:

#include <stdio.h>
#include <math.h>
#define M_H 1.007975/(6.02214076*pow(10,23)*1000)
#define k_B 1.380649*pow(10,-23)
int main()
{
    printf("%G\n",M_H);
    printf("%G\n",k_B);
    printf("%G\n",M_H/k_B);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

因为它给出:

1.67378E-27
1.38065E-23
1.21232E-50
Run Code Online (Sandbox Code Playgroud)

我需要定义的常量。

我使用带有-lm标志的 gcc 12.2.1-1。我期待着:

1.67378E-27
1.38065E-23
1.21232E-4
Run Code Online (Sandbox Code Playgroud)

ybu*_*ill 7

M_H/k_B扩展到:

1.007975/(6.02214076*pow(10,23)*1000)/1.380649*pow(10,-23)
Run Code Online (Sandbox Code Playgroud)

请注意,第二个pow没有括在括号中,因此乘法是在前面的除法之后进行的。您应该将定义括在括号中以防止出现这种情况:

#define M_H (1.007975/(6.02214076*pow(10,23)*1000))
#define k_B (1.380649*pow(10,-23))
Run Code Online (Sandbox Code Playgroud)

我还建议您pow1e-23语法(又名科学记数法)替换函数调用;这样, in 中的数字k_B将被解析为单个标记,并且那里不需要括号:

#define M_H (1.007975/6.02214076e26)
#define k_B 1.380649e-23
Run Code Online (Sandbox Code Playgroud)

我需要定义的常量

如果由于某种原因您无法修改这些定义,您仍然可以在使用时添加括号:

printf("%G\n",(M_H)/(k_B));
Run Code Online (Sandbox Code Playgroud)