划分双打时意外失去精度

mad*_*ina 6 c++ precision double

我有一个函数getSlope,它接受4个双精度参数并返回另一个使用这个给定参数计算的双精度,方法如下:

double QSweep::getSlope(double a, double b, double c, double d){
double slope;
slope=(d-b)/(c-a);
return slope;
}
Run Code Online (Sandbox Code Playgroud)

问题是当使用参数调用此函数时,例如:

getSlope(2.71156, -1.64161, 2.70413, -1.72219);
Run Code Online (Sandbox Code Playgroud)

返回的结果是:

10.8557
Run Code Online (Sandbox Code Playgroud)

这对我的计算来说不是一个好结果.我使用Mathematica计算了斜率,相同参数的斜率结果为:

10.8452
Run Code Online (Sandbox Code Playgroud)

或者更精确的数字:

10.845222072678331.
Run Code Online (Sandbox Code Playgroud)

我的程序返回的结果在我的进一步计算中并不好.此外,我不明白该程序如何从10.845222072678331开始返回10.8557(假设这是该部门的近似结果)?如何才能为我的部门取得好成绩?

马达里亚,先谢谢你


我使用命令行打印结果:

std::cout<<slope<<endl;
Run Code Online (Sandbox Code Playgroud)

可能是我的参数可能不好,因为我从另一个程序中读取它们(计算图形;从我的图形中读取这些参数后,我刚刚显示它们以查看它们的值但是显示的矢量可能不一样计算值的内部精度.我不知道它真的很奇怪.出现一些数值误差..)

当计算我正在读取我的参数的图形时,使用一些用C++编写的数字库(带有模板).没有OpenGL用于此计算.

谢谢,madalina

kle*_*lew 7

我试过浮动而不是双倍,因此得到10.845110.它仍然看起来比madalina结果更好.

编辑:

我想我知道你为什么得到这个结果.如果从其他地方获得a,b,c和d参数并打印它,它会为您提供舍入值.然后,如果你把它放到Mathemtacia(或计算;))它会给你不同的结果.

我尝试改变你的一个参数.当我做的时候:

double c = 2.7041304;
Run Code Online (Sandbox Code Playgroud)

我得到10.845806.我只添加0.0000004到c!所以我认为你的"错误"不是错误.以更高的精度打印a,b,c和d,然后将它们放到Mathematica中.


Myk*_*yev 5

可能是你在项目中使用DirectX或OpenGL?如果是这样,他们可以关闭双精度,你会得到奇怪的结果.

您可以使用检查精度设置

std::sqrt(x) * std::sqrt(x)
Run Code Online (Sandbox Code Playgroud)

结果必须非常接近x.我很久以前就遇到过这个问题,花了一个月检查所有公式.但后来我发现了

D3DCREATE_FPU_PRESERVE
Run Code Online (Sandbox Code Playgroud)


小智 5

以下代码:

#include <iostream>
using namespace std;

double getSlope(double a, double b, double c, double d){
    double slope;
    slope=(d-b)/(c-a);
    return slope;
}

int main( ) {
    double s = getSlope(2.71156, -1.64161, 2.70413, -1.72219);
    cout << s << endl;
}
Run Code Online (Sandbox Code Playgroud)

得到10.8452与g ++的结果.你是如何在代码中打印出结果的?