1

我想知道是否将C中的机器精度从浮点数增加到精度数是否会自动提高级数展开中的项,例如三角函数?

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

4

2 回答 2

5

通常,影响例程执行正弦、对数等的准确性的因素是您调用的例程版本。一个好的数学库对于单精度正弦(C'ssinf函数)、双精度正弦(C's sin)和长双精度正弦(C's)有单独的例程sinlsinf在 C 中,您通常通过编写对、sin或的调用来显式调用这些版本sinl。C 还提供<tgmath.h>,这会导致源代码sin(x)根据x. 在 C++ 中,函数调用也将根据变量的类型进行解析。

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

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

于 2013-04-03T12:59:29.850 回答
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 编译器)。

于 2013-04-03T13:08:30.400 回答