C 在标题中由#define isn';t由代码设置
我编写了一个非常简单的代码,用于计算函数的值:C 在标题中由#define isn';t由代码设置,c,c-preprocessor,C,C Preprocessor,我编写了一个非常简单的代码,用于计算函数的值: #定义最小值0.00001 #定义最大值1 #定义maxp10000 双功能日志(双x) { 双r=RPWN; printf(“MAXP=%e\n”,MAXP); printf(“MIN=%e\n”,MIN); printf(“MAX=%e\n”,MAX); 双y; 如果(x>r | | x==0)返回(0.0); 否则{ y=r+((r*r)/(2.*x)-x/2。)*log((1+r/x)/(r/x-1)); } 返回y; } 该函数位于与
#定义最小值0.00001
#定义最大值1
#定义maxp10000
双功能日志(双x)
{
双r=RPWN;
printf(“MAXP=%e\n”,MAXP);
printf(“MIN=%e\n”,MIN);
printf(“MAX=%e\n”,MAX);
双y;
如果(x>r | | x==0)返回(0.0);
否则{
y=r+((r*r)/(2.*x)-x/2。)*log((1+r/x)/(r/x-1));
}
返回y;
}
该函数位于与其他源文件一起编译的.c文件中。问题是不能将MAXP
设置为其值。以下是当我要求打印MIN
、MAXP
和MAXP
的值时得到的结果:
MAXP=4.940656e-324
最小值=1.000000e-05
最大值=1.000000 E+00
我真的不明白为什么我得到
4.940656e-324
的MAXP
,我从来没有这样的问题。另外,当我编写#定义MAXP 10000.
时,我会得到MAXP=1.000000e+04
。我用gcc编译,有人有什么线索吗?问题是%e
打印浮点型和双精度型,但打印的是MAXP和MAX-type整数
您可以使用
%d
打印整数。问题是%e
打印浮点型和双精度型,但您的MAXP和MAX-type整数
您可以使用
%d
打印整数。问题不在于MAXP
的值,而在于用于打印它的格式说明符%e
MAXP
不是变量,而是宏。因此,它没有与之关联的类型。编译器从上下文中计算出1000
的类型,在printf
的情况下,这意味着int
(默认解释为1000
)。在不同的上下文中,1000
可以被解释为浮点
或双精度
,例如float f=MAXP
需要记住的一件重要事情是,在代码体中,MAXP
以文本形式替换为1000
如果希望默认情况下将MAXP
解释为双精度,请在末尾添加.0
:
#define MAXP 10000.0
如果希望它保持整数文字,请使用%d
打印它
printf(" MAXP = %d \n", MAXP);
或添加显式强制转换:
printf(" MAXP = %e \n", (double)MAXP);
问题不在于
MAXP
的值,而在于用于打印它的格式说明符%e
MAXP
不是变量,而是宏。因此,它没有与之关联的类型。编译器从上下文中计算出1000
的类型,在printf
的情况下,这意味着int
(默认解释为1000
)。在不同的上下文中,1000
可以被解释为浮点
或双精度
,例如float f=MAXP
需要记住的一件重要事情是,在代码体中,MAXP
以文本形式替换为1000
如果希望默认情况下将MAXP
解释为双精度,请在末尾添加.0
:
#define MAXP 10000.0
如果希望它保持整数文字,请使用%d
打印它
printf(" MAXP = %d \n", MAXP);
或添加显式强制转换:
printf(" MAXP = %e \n", (double)MAXP);
MAX和MAXP是打印为双精度的整数常量。幸福不是选择之一。向定义中添加小数点。启用编译器警告。投票以简单的打字错误结束此操作。@Lundin不一定是打字错误,问题是可以的。对于初学者来说,这种行为实际上看起来strange@MichaelWalz好吧,那就跟我一样接近。@Lundin离我还不够近。OP可能无法理解Max和MAXP是打印为双精度的整数常量。幸福不是选择之一。向定义中添加小数点。启用编译器警告。投票以简单的打字错误结束此操作。@Lundin不一定是打字错误,问题是可以的。对于初学者来说,这种行为实际上看起来strange@MichaelWalz好吧,那就跟我一样接近。@Lundin离我还不够近。OP可能不会理解事实上,你甚至不需要结尾处的
0
(以防程序员误认为它是一个重要数字),你只需要小数点或指数部分。事实上,你甚至不需要结尾处的0
(如果程序员可能会将其误认为一个重要数字),您只需要小数点或指数部分。