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

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

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

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

 #include  #include  int main() { std::cout << "double_max = " << std::numeric_limits().max() << std::endl; std::cout << "double_min = " << std::numeric_limits().min() << std::endl; std::cout << "float_max = " << std::numeric_limits().max() << std::endl; std::cout << "float_min = " << std::numeric_limits().min() << std::endl; } 

DEMO

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

我怀疑它取决于我们正在使用的架构。

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

无论如何,内部表示和处理的内容可能会因您所指出的而有所不同

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

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

您始终可以定义自己管理物理资源的自定义数据类型。 你所指的术语可能是任意精度算术 (通常相当慢,如果你的数据适合硬件提供的,你应该去做)。

在特定情况下(例如,某些没有FPU可用的嵌入式单元或者不能执行浮点操作)可以使用仿真。 这是更便宜(更少的晶体管),虽然更慢。

上限和下限取决于编译器浮点数的实现。 所以它不仅仅是用户定义的限制。 而它的数学约束取决于编译器为存储浮点数而设计的内存布局。

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

在普通的C中,你可以#include 提供常量,例如:

 DBL_MAX DBL_MIN FLT_MAX FLT_MIN 

以及尾数是多少位和数字,指数范围等。

我总是很困惑哪个C ++参考网站是“你可以在这里发布的,哪个是你不应该的,因为你得到了关于它的评论”,但这里有一个在google: http中找到的://www.cplusplus.com/reference/cfloat/由于这是一个标准文件,我希望无论如何都没有太大的区别。 当然,这指的是“C ++ – ified version”,但是定义的宏对于C来说是相同的。

(注意,C ++ limits通常是在某种意义上直接或间接地从float.h中找到的相同常量实现的)