Форум программистов, компьютерный форум CyberForum.ru

Засада с машинным эпсилон, или Либо я дурак - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Тема: Записи. Работа с текстовыми файлами http://www.cyberforum.ru/cpp-beginners/thread634393.html
Тема: Записи. Работа с текстовыми файлами. Дан файл f, содержащий сведения о багаже нескольких пассажиров. Багаж пассажира характеризуется количеством вещей и общим весом вещей. Сведения о багаже каждого пассажира представляют собой запись с двумя полями: одно поле целого типа (количество вещей) и одно - действительное (вес в килограммах). Найти число пассажиров, имеющих более двух вещей и число...
C++ Отобразить вектор в обратном порядке не используя реверсивные итераторы Отобразить вектор в обратном порядке не используя реверсивные итераторы никак не могу в цикле вывести последний(самый первый) элемент http://www.cyberforum.ru/cpp-beginners/thread634358.html
C++ минимум среди сумм элементов диагоналей, параллельных главной
Оформить каждую задачу в виде функции. Все необходимые данные для функций должны передаваться в качестве параметров. Использование глобальных переменнх в функциях не допускается. По теме "Массивы". Найти: 1) сумму элементов в тех строках, которые не содержат отрицательных элементов; 2) минимум среди сумм элементов диагоналей, параллельных главной. По теме "Обработка символьных данных и...
Создание папки в Linux C++
Привет форумчане!! Подскажите апишку с директивой что бы в линухе можно было создать папку в указаной пользователем директории!?
C++ Включние заголовочного файла name.h http://www.cyberforum.ru/cpp-beginners/thread634321.html
Доброго времени суток. Суть проблемы такова: допустим есть папка, в которой куча хедеров (.h) + в ней еще папки в которых еще куча хедеров и т.д. Есть главный main.h который подключает другие библиотеки из этой папки, а подключенные подключают другие и т.д. Так вот, во всех хедерах подключение написано следующем образом : //main.h #include <main/temp.h> #include <temp2.h> Само сабой это...
C++ Что такое char* ? char* szString = "Randy"; Объясните, чем в данном случае является szString? Если это указатель, то почему ему напрямую можно присвоить значение? Ведь указатели с адресами работают. Очень уж непонятна мне роль * в этом примере. подробнее

Показать сообщение отдельно
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99

Засада с машинным эпсилон, или Либо я дурак - C++

07.08.2012, 18:08. Просмотров 2608. Ответов 18
Метки (Все метки)

Эту задачку выполняют все начинающие.

Так вот, берём два простеньких кода. Они настолько коротки, тупы и очевидны, что я даже не комментировал их.

Первый, работает нормально.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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;
}
Второй, тоже вроде с виду пристойный, ещё и короче первого - казалось бы, ляпота!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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. То бишь он какого-то хрена полосатого делает преобразование типа. Вопрос: ГДЕ тут это может быть?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru