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

时间:2014-10-19 08:10:49

标签: 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;
}

DEMO

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

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

3 个答案:

答案 0 :(得分:4)

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

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

  

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

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

您始终可以定义自己管理物理资源的自定义数据类型。您引用的术语可能是Arbitrary precision arithmetic(通常相当慢,如果您的数据符合硬件提供的内容,您应该选择它)。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

在普通C中,你可以#include <float.h>提供常量,例如:

DBL_MAX
DBL_MIN

FLT_MAX
FLT_MIN

以及多少位和&amp;尾数为数字,指数范围等。

我总是很困惑哪个C ++参考网站是&#34;你可以在这里发帖,哪个是你不应该发布的,因为你得到了关于它的评论和&#34; #34;,但这里有一个在google中找到的: http://www.cplusplus.com/reference/cfloat/ 由于这是一个标准文件,我希望无论如何都没有那么大的差别。当然,这指的是&#34; C ++ - ified版本&#34;,但定义的宏对于C是相同的。

(请注意,C ++ limits通常是根据float.h在某种意义上直接或间接找到的相同常量实现的。