2017-03-03 74 views
2
#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; 
} 

输出:为什么从math.h库中得到错误的结果?

随着的tanh函数= 0.520737

实际值= 0.523599

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

+1

[C中宏的括号需要](http://stackoverflow.com/q/10820340/995714) –

+0

@LưuVĩnhPhúc注意在这种情况下,它应该评估为相同的结果 – immibis

+0

@immibis是的我知道。这只是一个应该熟悉的行为 –

回答

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。事实并非如此。

+0

我也在matlab 2014b中测试过。不得不放弃我几乎写下来的答案。 :D – silentboy

6

你已经完全错误的身份。

实际身份是

的tanh -1 ⁄√3)= π ⁄ 6(其中是虚数单位,√ -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 

M_PI将会在任何POSIX兼容的系统math.h。显然,在Windows上使用

#define _USE_MATH_DEFINES 

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

+0

MS仅编写C++编译器,并且从不打算在Visual Studio中完全支持C99,因此您必须使用[C++ ](https://msdn.microsoft.com/en-us/library/0352zzhd.aspx )头文件或写一个[C语言中的包装器为你自己](http://stackoverflow.com/q/1063406/995714) –