我在进行一些浮点数计算时遇到了问题,我发现如果我将我的计算放在一行中,tan()函数会得到-0,而如果我将其拆成两行,则会得到0。看一下这段代码:
float theta = PI / 2.f;
float p = (PI / 2.f) - theta;
float result = tan(p);
以上,p = -0,结果为-4.37...
float theta = PI / 2.f;
float p = PI / 2.f;
p -= theta;
float result = tan(p);
上面这个式子,p=0,结果=0。
有人能解释一下这个区别吗?我猜-0是导致tan()的结果变成这样,尽管我在谷歌上找不到任何解释为什么。为什么完全相同的计算跨越不同的行会得出不同的答案?
谢谢。
tan
函数的行为。 - apple appleprintf("%2.f", tan(p));
在控制台中打印为 0,但 MSVC 显示结果为 -4.27。无论如何,问题似乎已经解决了。 - taurous#define PI 3.1412
是一个 double 字面量,它导致了这个问题的出现。在 double 中执行算术运算(而不是 float)可以解决这个问题。当然,将 PI 强制转换为 (float) 也可以是其中之一的解决方案。 - paulsm4