浮点数的上限和下限是如何确定的
How are upper and lower bounds for floating point numbers determined?
我对下面的报价有一个问题(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
中的相同常数直接或间接实现)
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 返回浮点数的小数位数
- txt 文件中浮点数的最大和最小值
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 将浮点数转换为无符号字符数组并打印出来
- 如何将时间字符串 (M:SS) 转换为浮点数
- 如何将浮点数(*)[6]转换为浮点**类型?
- C++将浮点数乘以分数
- 如何将浮点数转换为uint8_t?
- 如何确定以浮点数、双精度位数为单位的有效宽度:是否有标准定义?
- 用于确定C++中普通浮点数的代码
- 如何确定浮点数中的最后一个非零十进制数字
- 浮点数的上限和下限是如何确定的
- 如何确定浮点数何时通过整数边界