如何定义和使用小于2E-308的数字

How to define and use numbers smaller than 2e-308

本文关键字:小于 2E-308 数字 何定义 定义      更新时间:2023-10-16

最小的双为2.22507e-308。有什么办法可以使用较小的数字?我找到了一个名为GMP的库,但不知道如何使用它,文档根本不清楚,我不确定它在Windows上是否有效。

我不希望给我指示,但也许至少有一些建议。

如果您需要很大的精度,请给出gmp机会。我确定它也可以在Windows上工作。

如果您只需要比double更高的精度,请尝试long double。它可能会或可能不会给您更多,取决于您的编译器和目标平台。

在我的情况下,它确实给出了更多(GCC 6,x86_64 linux):

测试程序:

#include <iostream>
#include <limits>
int main() {
    std::cout << "float:"
        << " bytes=" << sizeof(float)
        << " min=" << std::numeric_limits<float>::min()
        << std::endl;
    std::cout << "double:"
        << " bytes=" << sizeof(double)
        << " min=" << std::numeric_limits<double>::min()
        << std::endl;
    std::cout << "long double:"
        << " bytes=" << sizeof(long double)
        << " min=" << std::numeric_limits<long double>::min()
        << std::endl;
}

输出:

float: bytes=4 min=1.17549e-38
double: bytes=8 min=2.22507e-308
long double: bytes=16 min=3.3621e-4932

如果您的编译器/体系结构允许它,则可以使用诸如long double之类的东西,将其编译为80位浮点(尽管我认为它与128位保持一致,所以浪费了一些浪费空间),并且比典型的double值具有更大的范围和精度。不过,并非所有的编译器都会做到这一点,在许多编译器上,long double等于double,在64位。

" GMP"是您可以用于扩展精度浮子的一个库。我通常建议包括GMP在内的MultipRecision,尽管个人,我会使用cpp_bin_floatcpp_dec_float来满足我的多重复需求(前者是IEEE756符合IEEE756,后者不是)

至于如何使用它们:我没有使用GMP,所以我无法对其语法发表评论,但是cpp_bin_float很容易使用:

typedef boost::multiprecision::cpp_bin_float_quad quad;
quad a = 34;
quad b = 17.95467;
b += a;
for(int i = 0; i < 10; i++) {
    b *= b;
}
std::cout << "This might be rather big: " << b << std::endl;

如果将编译器更改为gccIntel类型long double将得到更大的精确(80位)的支持。借助默认的Visual Studio编译器,我没有建议您该怎么做。