最低的双重正值 - 可以库特改变其价值
Lowest double positive value - can cout change its value?
本文关键字:改变 更新时间:2023-10-16
请考虑以下两个代码 - 它们之间的唯一区别是一个单个cout,它打印值EPS:
http://ideone.com/0beehz-在这里,该程序进入和无限循环,因为在代表EPS之后,EPS之后将价值更改为0
#include <iostream>
int main()
{
double tmp = 1.;
double eps;
while(tmp != 0) {
eps = tmp;
tmp /= 2.;
}
if(eps == 0) {
std::cout << "(1)eps is zero!n";
}
std::cout << "eps before: " << eps;
if(eps == 0) {
std::cout << "(2)eps is zero!n";
}
while(eps < 1.) {
tmp = eps;
eps *= 2.;
if(tmp == eps) {
printf("wtf?n");
}
}
std::cout << "eps after: " << eps;
}
http://ideone.com/pi4d30-在这里,我已经评论了cout。
#include <iostream>
int main()
{
double tmp = 1.;
double eps;
while(tmp != 0) {
eps = tmp;
tmp /= 2.;
}
if(eps == 0) {
std::cout << "(1)eps is zero!n";
}
//std::cout << "eps before: " << eps;
if(eps == 0) {
std::cout << "(2)eps is zero!n";
}
while(eps < 1.) {
tmp = eps;
eps *= 2.;
if(tmp == eps) {
printf("wtf?n");
}
}
std::cout << "eps after: " << eps;
}
因此,一个cout的一个cout更改了逻辑,非常令人惊讶。为什么?
我认为这是第5节(表达式)的情况,第11段
浮动操作数的值和浮动表达式的结果可以比类型所要求的更精确和范围;类型没有更改。
在工作中,参见。原始代码的这种变化。
while(tmp != 0) {
eps = tmp;
tmp /= 2.;
}
以扩展精度进行的计算和比较。循环一直运行,直到eps
是最小的正扩展值(可能是80位x87扩展类型)。
if(eps == 0) {
std::cout << "(1)eps is zero!n";
}
仍处于扩展精度,eps != 0
std::cout << "eps before: " << eps;
为了转换为打印字符串,eps
存储并转换为double
精度,导致0。
if(eps == 0) {
std::cout << "(2)eps is zero!n";
}
是的,现在是。
相关文章:
- 变量没有改变?通过向量的函数调用
- 如何改变c++应用程序的视觉效果
- C++在不同线程中改变向量
- 如何访问和改变存储在矢量C++中的对象
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 为什么 c++ 动态数组的大小没有改变?
- 为什么提升图库的 read_graphviz() 函数会改变节点的索引
- 在向量内更改变量的值不会改变其在向量外的值
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 改变或缩放两个正态分布以具有特定的相关系数
- 当我使用CHAR_INFO结构时,控制台会无缘无故地改变颜色
- 为什么我的函数接受"std::string"进行排序不会改变它?
- MFC:你能在CDateTimeCtrl中改变自旋的加速度吗?
- 为什么切换 for 循环的顺序会显著改变执行时间?
- 使用可变参数模板改变模板参数
- C++中物体改变识别的设计模式?
- 通过从构造函数中的'this'复制的指针改变常量对象
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 如果没有重新散列,为什么 unordered_set::begin() 会改变?