#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
为什么这两个值不同?它应该和我的理解一样。
答案 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。事实并非如此。