繁体   English   中英

为什么我的tan(PI / 2)=不定式

[英]Why didn't I get tan(PI /2) = infinty in C

当我计算tan(PI / 2)时,我得到-22877332的c值,但是tan(Pi / 2)是无穷大的。 和谷歌给它作为3060023.30695为什么我得到不同的答案

我尝试使用mingw编译器,并且在google中都给出了不同的答案

float32 Tan_f32 (float32 ValValue )
{
float32 Result_Val;

 Result_Val= (tanf(ValValue));
 return Result_Val;
 }

在mingw编译器中它给出-22877332和google 3060023.30695

因为π是非理性的,所以不可能将π/ 2传递给tantanf ,所以任何浮点数,无论多么精确,都至少与π/ 2稍有不同。 因此, tanf(ValValue)返回接近π/ 2的某个值的切线,并且该切线很大,但不是无限大。

在用于float的通用格式(IEEE-754基本32位二进制浮点)中,最接近π/ 2的可表示数字是1.57079637050628662109375。 该数字的切线约为-22877332.4289, float可表示的最接近值为-22877332,这是您得到的结果。 因此,对于您输入的数字, tanf将为您提供最佳的结果。

C标准,或者实际上是通用的但绝不是普遍存在的IEEE754浮点标准,不能保证tanCf sqrt )的准确性。 一个实现将在合理数量的时钟周期内取得良好结果时做出妥协。

特别是,渐近线附近的三角函数的行为尤其不可预测。 就是这种情况。

如果您想在整个域中使用良好的tan函数,则接受故障不是由于您的pi值引起的(值得一试,尽管请注意,因为pi是先验的,因此无法在任何浮点系统中准确表示) ,最好使用第三方数学库。

最后,请注意,在IEEE754下,如果让浮点除法处理极点并使用, 可能会在渐近线周围获得更一致的行为。

double c = cos(x); tan(x) = sqrt(1 / c / c  - 1);

这可能在数值上更稳定,因为IEEE754 定义了零除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM