小白问一个关于C++的问题

PikNik-avatar

PikNik

2021-11-09T15:39:33+00:00

#define pi 4.0*atan(1.0)
#define pi 3.14159
两个方式定义出来的pi,在Cout输出的时候是同一个数,但是用3.14159/pi算出来,前一个结果是0.61,后一个是1,这是为啥呢
jamess-avatar

jamess

计算顺序的问题
3.14159/pi -> 3.14159/4.0*atan(1.0) -> \frac{3.14159*atan(1.0)}{4.0}
Mresort-avatar

Mresort

第一个应该是变成3.14159/4.0*atan(1),加个括号才对
Fuzzy_samurai-avatar

Fuzzy_samurai

定义宏为什么不加括号呢?
Splatter-avatar

Splatter

少用define吧,用 const 有时候更好。
Christmas Blob!-avatar

Christmas Blob!

Define 定义后进行计算要注意计算的顺序啊
Oh Myerz-avatar

Oh Myerz

因为前一个的本质是3.1415926/4*atan(1.0),先除后乘
死神-avatar

死神

别用define,每次都要算一遍,atan很慢的
PikNik-avatar

PikNik

[quote][pid=566838330,29482260,1]Reply[/pid] Post by [uid=60070386]cheng.S[/uid] (2021-11-17 23:48):

定义宏为什么不加括号呢?[/quote]呃呃 看了楼上我才知道原来是这么个计算顺序
PikNik-avatar

PikNik

[quote][pid=566838595,29482260,1]Reply[/pid] Post by [uid=62806664]BIGBAOBAOBAO[/uid] (2021-11-17 23:49):

别用define,每次都要算一遍,atan很慢的[/quote]那怎么能快点改保持精度
Jesting Flames-avatar

Jesting Flames

上面有人和你说了 const
S.M-avatar

S.M

都define了 pi要大写[img]http://img.nga.178.com/attachments/mon_201209/14/-47218_5052bc835856c.png[/img]
MTS-avatar

MTS

define是替换
代进去计算顺序可能就跟你想的不一样
TrapsterDK-avatar

TrapsterDK

宏定义可以理解成简单的文本替换,替换后再编译
Shamwowters-avatar

Shamwowters

[quote][pid=566838922,29482260,1]Reply[/pid] Post by [uid=10390901]Jim28[/uid] (2021-11-17 23:51):

那怎么能快点改保持精度[/quote]手打就好了。
MattheW-avatar

MattheW

宏只做替换。没有任何计算逻辑