When a float variable goes out of the float limits, what happens?(当浮动变量超出浮动限制时,会发生什么?)
问题描述
我说了两件事:
std::numeric_limits<float>::max()+(一个小数)
给出:std::numeric_limits<float>::max()
.
std::numeric_limits<float>::max()+(a large number
like: std::numeric_limits<float>::max()/3)
提供信息.
std::numeric_limits<float>::max()+(a large number
like: std::numeric_limits<float>::max()/3)
gives inf.
为什么会有这种差异?1 或 2 是否会导致 OVERFLOW 并因此导致未定义的行为?
Why this difference? Does 1 or 2 results in an OVERFLOW and thus to an undefined behavior?
测试代码:
1.
float d = std::numeric_limits<float>::max();
float q = d + 100;
cout << "q: " << q << endl;
2.
float d = std::numeric_limits<float>::max();
float q = d + (d/3);
cout << "q: " << q << endl;
推荐答案
形式上,行为是未定义的.在具有 IEEE 的机器上然而,浮点数,四舍五入后会溢出在 Inf
中.但精度有限,结果FLT_MAX + 1
四舍五入后为 FLT_MAX
.
Formally, the behavior is undefined. On a machine with IEEE
floating point, however, overflow after rounding will result
in Inf
. The precision is limited, however, and the results
after rounding of FLT_MAX + 1
are FLT_MAX
.
FLT_MAX
下的值可以看到相同的效果.尝试类似:
You can see the same effect with values well under FLT_MAX
.
Try something like:
float f1 = 1e20; // less than FLT_MAX
float f2 = f1 + 1.0;
if ( f1 == f2 ) ...
if
将评估为 true
,至少使用 IEEE 算法.(确实存在,或者至少曾经存在过这样的机器float
有足够的精度让 if
评估为false
,但它们在今天并不常见.)
The if
will evaluate to true
, at least with IEEE arithmetic.
(There do exist, or at least have existed, machines where
float
has enough precision for the if
to evaluate to
false
, but they aren't very common today.)
这篇关于当浮动变量超出浮动限制时,会发生什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:当浮动变量超出浮动限制时,会发生什么?
基础教程推荐
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++,'if' 表达式中的变量声明 2021-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17