Эту задачку выполняют все начинающие. И вроде бы успешно, потому что задача тупая. Но у меня какая-то неожиданная чертовщина.
Так вот, берём два простеньких кода. Они настолько коротки, тупы и очевидны, что я даже не комментировал их.
Первый, работает нормально.
#include <iostream>
using std::cout;
using std::endl;
#include <iomanip>
using std::ios;
using std::setiosflags;
int main()
{
float a, b, e;
int counter;
e=1.0; b=1.0; a=1.0;
counter=0;
do
{
e=e/2;
a=b+e/2;
counter++;
}while (a>b);
cout << setiosflags(ios::scientific);
cout << sizeof(e) << endl;
cout << "eps=" << e << endl;
cout << "counter=" << counter << endl;
return 0;
}
Второй, тоже вроде с виду пристойный, ещё и короче первого - казалось бы, ляпота!
#include <iostream>
using std::cout;
using std::endl;
#include <iomanip>
using std::ios;
using std::setiosflags;
int main()
{
float a, e;
int counter;
e=1.0; a=1.0;
counter=0;
while (e/2+a>a)
{
e=e/2;
counter++;
}
cout << setiosflags(ios::scientific);
cout << sizeof(e) << endl;
cout << "eps=" << e << endl;
cout << "counter=" << counter << endl;
return 0;
}
Оба кода написаны с помощью Qt Creator 2.0.1.
Определить машинное эпсилон с помощью первого кода для разных типов можно, меняя одно-единственное слово в тексте, ака тип переменных (ну заломало меня извращаться, пусть будет пока так). Для float первый код даёт значение эпсилон 1.19e-7, для double 2.22e-16, для long double 1.08e-19. *Голосом Малышевой* Это - нормально. НО: второй код для ЛЮБОГО типа выдаёт 1.08e-19. То бишь он какого-то хрена полосатого делает преобразование типа. Поговаривают, что в Builder то же самое. Онлайн-IDE, вот эта http://ideone.com/ , таких чудес не выдаёт, всё работает как надо. Вопрос: где и какого хрена происходит преобразование типа?