如何确定浮点数的上限和下限?

8 c c++ floating-point

我对以下引用有疑问(N3797,3.9.1/8):

浮点类型的值表示是实现定义的.

据我所知,它为实现完全自由地定义了浮点数的边界.它们在中指定template<class T> class numeric_format.例如,

#include <iostream>
#include <limits>

int main()
{
    std::cout << "double_max = " << std::numeric_limits<double>().max() << std::endl;
    std::cout << "double_min = " << std::numeric_limits<double>().min() << std::endl;
    std::cout << "float_max = " << std::numeric_limits<float>().max() << std::endl;
    std::cout << "float_min = " << std::numeric_limits<float>().min() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

DEMO

我的问题是:浮点数的上下边界可以任意高或低,还是有限制?纯C是否还为浮点数提供了一组实现定义的值?

我怀疑这取决于我们正在使用的架构.

Mar*_* A. 5

内置类型的限制主要受硬件限制的约束。x64 CPU 通常使用IEEE 754表示来表示其浮点数据,如 FPA 标准(硬件协处理器)中所定义。

无论如何,事情在内部表示和处理的方式可能会有所不同,正如您所指出的

浮点类型的值表示是实现定义的

编译器通常具有底层目标系统的知识(尤其是指执行代码生成的后端),因此可以在 fp 算术提示时选择正确的指令集。

您始终可以定义自己管理物理资源的自定义数据类型。您所指的术语可能是任意精度算术(通常要慢得多,如果您的数据适合硬件提供的数据,则应该使用它)。

在特定情况下(例如,某些没有 F​​PU 可用或无法执行浮点运算的嵌入式单元)可能会使用仿真。虽然速度较慢,但​​它更便宜(更少的晶体管)。