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

How are upper and lower bounds for floating point numbers determined?

本文关键字:何确定 浮点数      更新时间:2023-10-16

我对下面的报价有一个问题(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;
}

演示

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

我怀疑这取决于我们正在使用的体系结构。

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

不管怎样,事情的内部表现和处理方式可能会有所不同,正如你所注意到的

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

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

您总是可以定义一个自定义的数据类型来自己管理物理资源。你所指的术语可能是任意精度算术(通常要慢得多,如果你的数据符合硬件提供的,你应该选择它)。

在特定情况下(例如,一些没有FPU可用或无法执行浮点运算的嵌入式单元),可以使用仿真。这更便宜(晶体管更少),尽管速度较慢。

上下限取决于编译器对浮点数的实现。因此,这不仅仅是用户定义的限制。相反,它的数学约束取决于编译器为存储浮点数而设计的内存布局。

如果您想要user-defined limit,您可以使用自定义整数类,该类为数值运算重载运算符,并在进行任何运算之前应用用户定义的限制。

在纯C中,您可以#include <float.h>,它提供常量,例如:

DBL_MAX
DBL_MIN
FLT_MAX
FLT_MIN

以及多少比特&尾数、指数范围等数字

我总是困惑于哪个C++参考网站是"你被允许在这里发布的,哪个是你不应该发布的,因为你会得到关于它的评论",但谷歌上有一个:http://www.cplusplus.com/reference/cfloat/由于这是一个相当标准的文件,我希望没有太大的区别。当然,这指的是"C++化版本",但定义的宏与C.相同

(请注意,C++limits通常由float.h中的相同常数直接或间接实现)