为什么math.h库中的tanh函数会给出错误的结果?

时间:2017-03-03 01:41:10

标签: c math.h

#include<stdio.h>
#include<math.h>
#define PI 2*acos(0.0)
int main(void)
{
    double theta;
    theta=tanh(1/(sqrt(3.0)));
    printf("With tanh function = %lf\n",theta);
    printf("Actual value = %lf\n",PI/6.0);
    return 0;
}

输出:

使用tanh函数= 0.520737

实际值= 0.523599

为什么这两个值不同?它应该和我的理解一样。

2 个答案:

答案 0 :(得分:6)

你的身份完全错了。

实际身份是

tanh -1 i /√3)=π i / 6(其中 i 是虚部,√-1)

C11可以轻松验证:

#define _XOPEN_SOURCE 700
#include<stdio.h>
#include<math.h>
#include<complex.h>

int main(void)
{
    complex double theta=catanh(I/sqrt(3.0));
    printf("With atanh function = %lf\n",cimag(theta));
    printf("Actual value = %lf\n",M_PI/6);
    return 0;
}

(住在coliru:http://coliru.stacked-crooked.com/a/f3df5358a2be67cd):

With atanh function = 0.523599
Actual value = 0.523599
在任何符合Posix标准的系统中,

M_PI将位于math.h。显然,在Windows上使用

#define _USE_MATH_DEFINES

但我不知道Visual Studio是否支持complex.h

答案 1 :(得分:3)

你的程序存在一些小缺陷,但没有一个导致它行为不端。

您的PI宏应加括号:

#define PI (2*acos(0.0))

但由于你使用它的方式,你碰巧没有括号而离开。

打印double值的正确格式实际为%f,但也接受%lf。 (%Lf用于long double%f也适用于float,因为可变函数的float参数被提升为double)。这也不会影响程序的行为。

事实上,您的程序运行正常。我已确认使用的HP 42S仿真器tanh(1/(sqrt(3.0)))约为0.520737(我得到0.520736883716)。

问题是你假设结果应该是π/ 6.0。事实并非如此。