当我计算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
答案 0 :(得分:6)
因为π是不合理的,所以不可能将π/ 2传递给tan
或tanf
,所以任何浮点数,无论多么精确,都至少与π/ 2稍有不同。 。因此,tanf(ValValue)
返回一些接近π/ 2的值的切线,并且该切线很大,但不是无限大。
在用于float
的通用格式(IEEE-754基本32位二进制浮点数)中,最接近π/ 2的可表示数字是1.57079637050628662109375。该数字的切线大约为-22877332.4289,在float
中可表示的最接近值为-22877332,这是您得到的结果。因此,tanf
为您提供的输入数字提供了最佳的结果。
答案 1 :(得分:3)
C标准,或者实际上是通用的但绝不是普遍存在的IEEE754浮点标准,不能保证tan
( Cf sqrt
)的准确性。一个实现将在合理数量的时钟周期内取得良好结果的过程中做出妥协。
尤其是,渐近线附近的三角函数的行为尤其不可预测;就是这种情况。
接受故障不是由于您的 pi 值引起的(值得一试,尽管请注意,由于 pi 是超验的,因此无法以任何浮动形式准确表示点系统),如果您希望在整个域中都具有良好的tan
功能,那么最好使用第三方数学库。
最后,请注意,在IEEE754下,如果让浮点除法处理极点并使用
,则可能 在渐近线周围获得更一致的行为。double c = cos(x); tan(x) = sqrt(1 / c / c - 1);
这可能在数值上更稳定,因为IEEE754 定义除以零。