首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C程序隐藏误差(数值计算)

C程序隐藏误差(数值计算)
EN

Stack Overflow用户
提问于 2014-02-11 19:38:34
回答 2查看 123关注 0票数 0

这里有两个函数。我看不出他们之间有什么重要的差别,但结果是不同的。为什么?

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

long double GiveCx(long double x)
{  
double a = 5.3226927610784935E-01;
double b = 6.5410208763684241E-01;
double c = -1.4312869957125389E+00;
double d = 8.4710834303177074E-01;
return (c*atanl(expl(x-a)/b) + d);
}

double BurkardtCollectionBased_sech_cdf_Offset_model(double x_in)
{
 double temp;
 temp = 0.0;
 // coefficients
 double a = 5.3226927610784935E-01;
 double b = 6.5410208763684241E-01;
 double c = -1.4312869957125389E+00;
 double Offset = 8.4710834303177074E-01;
 temp = c * atan(exp((x_in-a)/b));
 temp += Offset;
 return temp;
}

int main()
{
 int ix;
 for (ix=0; ix<5; ix++)
  printf(" ix = %d ; c = %.20f  ;  %.20Lf \n", ix,      BurkardtCollectionBased_sech_cdf_Offset_model( (long double)ix), GiveCx((long double )ix));
return 0;
}

结果如下:

ix =0;c= 0.25000064588764425721;-0.20004050665796930359

九=1;c= -0.75000921765452766010;-0.84455584419096496618

ix =2;c= -1.24993551212417064455;-1.18701705113792041978

九=3;c= -1.36825264215735509232;-1.32186430467910977205

九=4;c= -1.39401846938445195256;-1.37195787094497580628

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-11 19:42:25

其中一个是expl(x-a)/b,另一个是exp((x_in-a)/b)。检查b是否需要将指数除以后一种情况,或者结果是否与前一种情况一样。

您可能需要expl((x-a)/b) in GiveCx()

票数 4
EN

Stack Overflow用户

发布于 2014-02-11 19:47:24

主要问题是ja72状态,但请注意,根据编译器的不同,即使函数是一致的,结果也可能略有不同。

http://ideone.com/f29ugQ

ix =0;c= -0.20004050665796929698;-0.20004050665796930359 九=1;c= -0.84455584419096485504;-0.84455584419096496618 ix =2;c= -1.18701705113792033153;-1.18701705113792041978 九=3;c= -1.32186430467910986941;-1.32186430467910977205 九=4;c= -1.37195787094497578806;-1.37195787094497580628

其原因是编译器中的doublelong double的精度不同,不将long double化名为double,以及浮点计算的固有不精确性。尽管所提供的输入(除了xx_in)具有相同的精度,但您使用的是执行不同精度计算的函数(atanlexpl相对于atanexp)。atanlexpl都会将double输入扩展到long double,并且也可以使用该精度级别执行计算,这取决于编译器,而atanexp应该只执行double精度的计算(尽管一些编译器可以选择使计算比输入的类型更精确,因为这仍然会根据所执行的计算得到更准确的结果)。

这就是为什么,如果您需要完美的十进制精度,您必须使用支持任意数量小数位的定点库(尽管非理性值仍然超出了这种能力)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21711419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档