这里有两个函数。我看不出他们之间有什么重要的差别,但结果是不同的。为什么?
#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
发布于 2014-02-11 19:42:25
其中一个是expl(x-a)/b,另一个是exp((x_in-a)/b)。检查b是否需要将指数除以后一种情况,或者结果是否与前一种情况一样。
您可能需要expl((x-a)/b) in GiveCx()。
发布于 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
其原因是编译器中的double和long double的精度不同,不将long double化名为double,以及浮点计算的固有不精确性。尽管所提供的输入(除了x和x_in)具有相同的精度,但您使用的是执行不同精度计算的函数(atanl和expl相对于atan和exp)。atanl和expl都会将double输入扩展到long double,并且也可以使用该精度级别执行计算,这取决于编译器,而atan和exp应该只执行double精度的计算(尽管一些编译器可以选择使计算比输入的类型更精确,因为这仍然会根据所执行的计算得到更准确的结果)。
这就是为什么,如果您需要完美的十进制精度,您必须使用支持任意数量小数位的定点库(尽管非理性值仍然超出了这种能力)。
https://stackoverflow.com/questions/21711419
复制相似问题