24小时热门版块排行榜    

CyRhmU.jpeg
查看: 459  |  回复: 4
当前主题已经存档。

holmescn

金虫 (正式写手)

[交流] 【讨论】关于Intel CPP Compiler数学库的精度

翌日,波波版主提出Intel C++ Compiler虽然速度无敌,但是似乎存在精度误差。后来,我也在一次数值计算中体验了一把。Gcc结果为1e285量级,icc显示inf。不知道怎么回事。

今天,写了两个小程序,以检验gcc和icc数学函数库的计算精度差异。
我的系统是:Archlinux  2.6.32 Kernel
gcc:4.4.2
icc:11.1 非商业版

代码 gen.c:
CODE:
#include
#include

#define FUNC(x) exp(x)

const double begin=-8*3.1415926;
const double end=8*3.1415926;
const double step=1e-4;

int main()
{
        double num;

        for(num=begin;num         {
                printf("%20.20g %20.20g\n",num,FUNC(num));
        }

        return 0;
}

代码 compare.c
CODE:
#include
#include

#define FUNC(x) exp(x)


int main()
{
        double num=0,result=0;

        while(!feof(stdin))
        {
                scanf("%lf %lf",&num,&result);
                if(fabs((FUNC(num)-result)/FUNC(num))>1e-15
                    || fabs((FUNC(num)-result)/result)>1e-15)
                        printf("%6g %.20g %.20g %.3g %.3g\n", num, result,
                                  FUNC(num),
                                  fabs((FUNC(num)-result)/FUNC(num)),
                                  fabs((FUNC(num)-result)/result));
        }

        return 0;
}

测试命令:
CODE:
./gen | ./compare

OK.你可以用ICC编译gen.c,用gcc编译compare.c。然后测试一下。

我的结论是,icc和gcc的数学库完全满足双精度要求,不分彼此。至于溢出问题,大家发表下意见。
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tjyl

金虫 (正式写手)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
jjdg(金币+1,VIP+0):辛苦了! 1-12 01:01
建议使用Fortran里的4倍精度的函数(qexp)来作参考值。
不过其实双精度后面没有必要用20位小数,你可以看看输出的后面的一截都是随机的(第一列更 有说服力)。
http://www.china-pub.com/42116#zyz
这本书开始的列子我当时用 real*16 计算过,基本上也足够了。不过双精度的计算结果是没有任何意义的。
不同的函数库里定义的精度不一样吧,只要符合IEEE 754就是合格的了。
引用回帖:
Originally posted by holmescn at 2010-1-11 16:02:
翌日,波波版主提出Intel C++ Compiler虽然速度无敌,但是似乎存在精度误差。后来,我也在一次数值计算中体验了一把。Gcc结果为1e285量级,icc显示inf。不知道怎么回事。

今天,写了两个小程序,以检验gcc和ic ...

2楼2010-01-11 23:47:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

波不动

木虫 (正式写手)

Wave No Move


小木虫(金币+0.5):给个红包,谢谢回帖交流
引用回帖:
Originally posted by holmescn at 2010-1-11 16:02:
翌日,波波版主提出Intel C++ Compiler虽然速度无敌,但是似乎存在精度误差。后来,我也在一次数值计算中体验了一把。Gcc结果为1e285量级,icc显示inf。不知道怎么回事。

今天,写了两个小程序,以检验gcc和ic ...

很可能是我用法问题。因为要调用别人的各种函数,所以我的程序中float型和double中的转换太混乱,以至于在gcc下没事,但在icc下就会出问题。

小误差最后也可能被放大数万倍,导致看起来像是编译器精度问题。
端好自己的碗,吃好自己的饭。
3楼2010-01-12 02:20:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

这个我知道的,根据IEEE 754 标准,Double 只保证15位有效数字。我输出20位,是为了人工验证结果。呵呵。
引用回帖:
Originally posted by tjyl at 2010-1-11 23:47:
建议使用Fortran里的4倍精度的函数(qexp)来作参考值。
不过其实双精度后面没有必要用20位小数,你可以看看输出的后面的一截都是随机的(第一列更 有说服力)。
http://www.china-pub.com/42116#zyz
...

4楼2010-01-12 10:07:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)


jjdg(金币+1,VIP+0):感谢回帖交流 1-12 18:11
这确实是个问题。我看还是用Fortran保险啊。
引用回帖:
Originally posted by 波不动 at 2010-1-12 02:20:


很可能是我用法问题。因为要调用别人的各种函数,所以我的程序中float型和double中的转换太混乱,以至于在gcc下没事,但在icc下就会出问题。

小误差最后也可能被放大数万倍,导致看起来像是编译器精度问题。

5楼2010-01-12 10:09:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 holmescn 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见