Наименьшее двойное положительное значение — может ли cout изменить свое значение?

Рассмотрим два следующих фрагмента кода — единственное различие между ними заключается в единственном cout, который печатает значение eps:
http://ideone.com/0bEeHz — здесь программа входит в бесконечный цикл, т.к. после cout 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;
}

Следовательно, один-единственный бросок изменяет логику программы резко и очень удивительно. Это почему?

3

Решение

Я думаю, что это случай раздела 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";
}

Да, теперь это так.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]