我对以下引用有疑问(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)
我的问题是:浮点数的上下边界可以任意高或低,还是有限制?纯C是否还为浮点数提供了一组实现定义的值?
我怀疑这取决于我们正在使用的架构.
内置类型的限制主要受硬件限制的约束。x64 CPU 通常使用IEEE 754表示来表示其浮点数据,如 FPA 标准(硬件协处理器)中所定义。
无论如何,事情在内部表示和处理的方式可能会有所不同,正如您所指出的
浮点类型的值表示是实现定义的
编译器通常具有底层目标系统的知识(尤其是指执行代码生成的后端),因此可以在 fp 算术提示时选择正确的指令集。
您始终可以定义自己管理物理资源的自定义数据类型。您所指的术语可能是任意精度算术(通常要慢得多,如果您的数据适合硬件提供的数据,则应该使用它)。
在特定情况下(例如,某些没有 FPU 可用或无法执行浮点运算的嵌入式单元)可能会使用仿真。虽然速度较慢,但它更便宜(更少的晶体管)。