在C+;中处理极其精确的浮点计算时,保持精度的标准方法是什么+;? 我正在把程序转换成C++(类似于Matlab),并且需要保持与以前代码保持的相同的精度。

在C+;中处理极其精确的浮点计算时,保持精度的标准方法是什么+;? 我正在把程序转换成C++(类似于Matlab),并且需要保持与以前代码保持的相同的精度。,c++,math,precision,gmp,C++,Math,Precision,Gmp,注意:尽管保持相同的精度水平是理想的。如果完成的结果存在一些错误,则可以接受。我面临的问题(如下所示)是由于循环造成的,因此计算误差会很快复合。但如果最终结果仅相差千分之一左右(例如1/1000对1/1001),则不会有问题 我简要介绍了几种不同的方法,包括: Int vs Float示例:不要使用Float 12.45,而是将其存储为124500的整数。然后,只要在适当的时候将所有内容转换回来即可。注意:我不确定这将如何与我正在使用的代码一起工作(更多细节见下文) 我的程序如何产生错误

注意:尽管保持相同的精度水平是理想的。如果完成的结果存在一些错误,则可以接受。我面临的问题(如下所示)是由于循环造成的,因此计算误差会很快复合。但如果最终结果仅相差千分之一左右(例如1/1000对1/1001),则不会有问题

我简要介绍了几种不同的方法,包括:

Int vs Float示例:不要使用Float 12.45,而是将其存储为124500的整数。然后,只要在适当的时候将所有内容转换回来即可。注意:我不确定这将如何与我正在使用的代码一起工作(更多细节见下文)

我的程序如何产生错误结果的示例:

for (int i = 0; i <= 1000; i++)
{
    for (int j = 0; j <= 10000; j++)
    {
        // This calculation will be computed with less precision than in Scilab
        float1 = (1.0 / 100000.0);

        // The above error of float2 will become significant by the end of the loop
        float2 = (float1 + float2);
    }
}

for(inti=0;i如果编译器支持它,请使用BCD(二进制编码的十进制)


Sam

如果您使用GCC编译器,另一种选择是使用quadmath/\uuu128类型

是否有一种普遍接受的方法来保持浮动轴承的精度 点算法

“普遍接受”太宽泛了,所以没有

上述方法之一是否足够

是的。尤其是gmp似乎是一个标准的选择。我还想看看


手工编码的整数方法也可以工作,但肯定不是选择的方法:它需要更多的编码,更严格地存储和处理算术上精确的整数。

在这样移植代码时保持精度是非常困难的。这不是因为语言在什么方面有隐含的不同观点
float
是,但由于精度限制的不同算法或假设。例如,在Scilab中执行数值积分时,它可能使用高斯求积方法。而您可以尝试使用梯形方法。两者可能都使用相同的IEEE754单精度浮点数s、 但是由于这两种算法的收敛特性,你会得到不同的答案。那么,你如何解决这个问题呢

好的,您可以浏览Scilab源代码,查看它为您所需的每件事情使用的所有算法。然后,您可以复制这些算法,处理Scilab隐式执行的任何数据预处理或后处理(如果有)这是一项很重要的工作。坦白说,也许不是最好的方法来花你的时间。相反,我会考虑使用与其他语言部分的接口来查看你如何直接从C、C++、java或FORTRAN代码调用Scilab函数。
当然,在第二个选项中,你必须考虑如何分配你的代码(如果你需要的话)。Scilab有一个GPL兼容的许可证,所以你可以用你的代码把它捆绑起来。但是,它相当大(~180MB),你可能想把你需要的部分捆起来(例如,你不需要整个解释器系统)。。这是以不同的方式进行的更多工作,但可以保证与当前Scilab解决方案的数字兼容性。

您应该编辑问题,以提供更多自包含的代码示例,而不仅仅是提供链接。我必须遵循您的链接(实际上我没有这样做),这非常令人恼火首先要了解你所问问题的本质。请在你的问题中提供一个a。你需要多高的精度?看看这里:谢谢你的回答。幸运的是,我只处理标准算术(例如+-*/),所以我不必担心转换任何算法(假设上述操作员在两种语言中工作相同)@PaulWarnick如果你只处理简单的算术运算,那么为什么在Scilab不使用GMP的情况下,你还要考虑使用任意精度的库呢?我对你的总体目标感到困惑。我越是关注我的问题,我就越开始明白我其实并不需要GMP。从我的问题:(尤其是接受的答案和下面的评论)我开始思考如何解决这个问题。我最初提出这个问题的理由是因为我觉得ScILAB保持了比标准的C++双精度更高的精度,而实际上它们遵循的是IEEE标准。