在 C++ 中,long double 是标准浮点类型中精度最高的,如下表所示。
然而,如果 long double 的精度仍然不能满足你的需求,你可以考虑以下几种方法来提高数值计算的精度:
使用第三方库: GMP (GNU Multiple Precision Arithmetic Library): 这是一个自由软件数学库,用于任意精度的算术运算,支持整数、有理数和浮点数。 MPFR (Multiple Precision Floating-Point Reliable) Library: 基于 GMP 构建,提供可移植且可靠的多精度浮点数计算。 Boost.Multiprecision: Boost 库的一部分,提供了多种高精度算术类型,包括封装了 GMP 和 MPFR 的接口。
自定义数据类型:如果你的需求非常特殊,可以尝试自己实现一个高精度的数据类型。这通常涉及到实现加法、减法、乘法、除法等基本运算,以及可能的其他数学函数。这是一个相当复杂的任务,通常只有在没有合适的现成库可用时,才会选择这样做。 算法优化:有时候,提高计算精度并不是通过增加数据类型的精度来实现,而是通过对算法进行优化。例如,使用 Kahan 求和算法来减少浮点数累加过程中的舍入误差。 混合精度计算:在某些情况下,可以通过在计算的不同阶段使用不同精度的数据类型来优化性能和精度之间的平衡。例如,在初步计算中使用较低精度快速得到结果,然后在关键步骤中使用高精度以确保准确性。
另外,如果你不局限于 C++ 编程,可以考虑一下 Fortran。Fortran 的四倍精度浮点数类型real(kind=16)
能提供 128 位精度(约 34 位十进制数字的精度),明显优于 C++ 的 long double 提供的 80 位精度(约 19 位十进制数字的精度)。详细介绍可以参考以下公众号文章:
综上,选择哪种方法取决于你的具体应用需求、性能要求以及对开发复杂度的接受程度。对于大多数需要超过 long double 精度的应用来说,使用成熟的第三方库或者更换为 Fortran 语言是最简单也是最可靠的选择。
推荐阅读
在 C++ 中,long double 是标准浮点类型中精度最高的,如下表所示。
然而,如果 long double 的精度仍然不能满足你的需求,你可以考虑以下几种方法来提高数值计算的精度:
使用第三方库: GMP (GNU Multiple Precision Arithmetic Library): 这是一个自由软件数学库,用于任意精度的算术运算,支持整数、有理数和浮点数。 MPFR (Multiple Precision Floating-Point Reliable) Library: 基于 GMP 构建,提供可移植且可靠的多精度浮点数计算。 Boost.Multiprecision: Boost 库的一部分,提供了多种高精度算术类型,包括封装了 GMP 和 MPFR 的接口。 自定义数据类型:如果你的需求非常特殊,可以尝试自己实现一个高精度的数据类型。这通常涉及到实现加法、减法、乘法、除法等基本运算,以及可能的其他数学函数。这是一个相当复杂的任务,通常只有在没有合适的现成库可用时,才会选择这样做。 算法优化:有时候,提高计算精度并不是通过增加数据类型的精度来实现,而是通过对算法进行优化。例如,使用 Kahan 求和算法来减少浮点数累加过程中的舍入误差。 混合精度计算:在某些情况下,可以通过在计算的不同阶段使用不同精度的数据类型来优化性能和精度之间的平衡。例如,在初步计算中使用较低精度快速得到结果,然后在关键步骤中使用高精度以确保准确性。
另外,如果你不局限于 C++ 编程,可以考虑一下 Fortran。Fortran 的四倍精度浮点数类型real(kind=16)
能提供 128 位精度(约 34 位十进制数字的精度),明显优于 C++ 的 long double 提供的 80 位精度(约 19 位十进制数字的精度)。详细介绍可以参考以下公众号文章:
综上,选择哪种方法取决于你的具体应用需求、性能要求以及对开发复杂度的接受程度。对于大多数需要超过 long double 精度的应用来说,使用成熟的第三方库或者更换为 Fortran 语言是最简单也是最可靠的选择。
推荐阅读