提高机器精度是否会自动提高系列扩展的条件?

时间:2013-04-03 12:13:57

标签: c floating-point precision series expansion

我想知道在 C 中将机器精度从 float 增加到 double 会自动提高系列扩展中的条件,例如三角函数?

这和我关于堆栈溢出的其他问题与调查各向异性介质中波动方程中出现的数值不稳定性有关。

2 个答案:

答案 0 :(得分:5)

通常,影响执行正弦,对数等的例程的准确性的因素是您调用的例程的版本。一个好的数学库有单精度正弦(C sinf函数),双精度正弦(C sin)和长双正弦(C sinl)的独立程序。在C中,您通常通过编写对sinfsinsinl的调用来明确调用这些版本。 C还提供<tgmath.h>,这会导致源代码sin(x)扩展为特定版本,具体取决于x的类型。在C ++中,函数调用也将根据变量的类型进行解析。

在一个好的数学库中,sinf例程将使用更快的算法,精度适合float的精度,而sin将使用适合精度的较慢算法double。数学库的质量各不相同,因为编写这些例程是一项复杂的任务。

不使用系列扩展。 (特别是,由于误差分布差并且需要太多的项来收敛,因此不使用泰勒级数。)相反,使用精心准备的近似多项式。通常使用某种形式的极小极大多项式。更精确类型的例程可能使用具有更多项的多项式,但它也可能以其他方式改变,例如将域划分为更多区间或使用某种形式的扩展精度。这些都不是自动的;例程由软件开发人员手动准备。

答案 1 :(得分:0)

根据this reference,虽然C ++有sin(x)函数的不同版本,但

  

在C中,只有此函数的双重版本存在此名称

为了证实这一点,我写了以下几行代码:

#include <stdio.h>
#include <math.h>

int main(void){

    double d = 0.12345e16;
    float f;
    f = d;

    printf("the difference is %f\n", sin(d) - sin(f));

    f = 0.12345e16;
    d = f;
    printf("the difference is now %f\n", sin(d) - sin(f));

}

这会产生以下输出(使用C编译器编译时):

the difference is 1.947785
the difference is now 0.000000
编辑 - 我的原始代码中有拼写错误。现在更新,并给出预期的结果。

以上显示两个参数的评估方式相同,确认使用了相同的算法。

这是在Linux上使用gcc编译器,使用-lm选项,使用名为fltchk.c的文件(我认为应该使gcc使用C编译器)。