Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++数值分析准确的数据结构?_C++_Numerical Analysis - Fatal编程技术网

C++数值分析准确的数据结构?

C++数值分析准确的数据结构?,c++,numerical-analysis,C++,Numerical Analysis,采用双类型三次样条插值算法。 这项工作似乎是成功的,但当计算非常小的值时,相对误差在6%左右 double数据类型足以进行精确的科学数值分析吗?double在大多数应用中具有足够的精度。当然它是有限的,但是使用一个糟糕的算法总是可能浪费任何数量的精度。事实上,那应该是你的第一个嫌疑犯。仔细看看你的代码,看看你是在做一些让舍入误差积累得比必要的更快的事情,还是在做一些危险的事情,比如相距非常近的值相减。如果双精度足以满足你的需要,这取决于你使用的数字类型。正如亨宁所建议的,最好看看你正在使用的算法

采用双类型三次样条插值算法。 这项工作似乎是成功的,但当计算非常小的值时,相对误差在6%左右


double数据类型足以进行精确的科学数值分析吗?

double在大多数应用中具有足够的精度。当然它是有限的,但是使用一个糟糕的算法总是可能浪费任何数量的精度。事实上,那应该是你的第一个嫌疑犯。仔细看看你的代码,看看你是在做一些让舍入误差积累得比必要的更快的事情,还是在做一些危险的事情,比如相距非常近的值相减。

如果双精度足以满足你的需要,这取决于你使用的数字类型。正如亨宁所建议的,最好看看你正在使用的算法,确保它们在数值上是稳定的


首先,这里有一个很好的加法算法:。

科学数值分析很难正确,这就是为什么我把它留给专业人士。您是否考虑过使用数字库而不是编写自己的库?Eigen是我目前最喜欢的:

我手头总是有最新的Numerical Recipes nr.com,它确实有一个关于插值的优秀章节。NR有一个限制性的许可证,但作者知道他们在做什么,并对每种数字技术提供了一个简洁的书面说明。其他图书馆包括:ATLAS和GNU科学图书馆


为了回答你的问题,对于大多数科学应用来说,加倍应该足够了,我同意前面的海报,它应该像一个算法问题。您是否考虑过发布所用算法的代码?

双精度最适合于任何问题,但如果多项式或函数快速振荡或重复,或维数相当高,则三次样条曲线将无法正常工作

在这种情况下,最好使用勒让德多项式,因为它们处理指数的变量


举个简单的例子,如果使用Euler、梯形或Simpson法则在三阶多项式内插值,则无需大量采样率即可获得曲线下的插值面积。但是,如果将这些应用于指数函数,则可能需要大大提高采样率,以避免失去很多精度。勒让德多项式更容易适应这种情况。

u对,这是算法问题。我刚刚改变了算法,得到了更好的数据。当我使用新算法的长双重类型时,我可以得到更精确的数据。