Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62

Возникновение странных погрешностей около нуля и возникающие из-за нее косяки

05.12.2011, 11:51. Показов 1186. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Сразу к делу, тренирую свое генетический алгоритм на тестовых функциях. Одна из них - функция де Йонга, формула во вложениях. Казалось бы, все просто, но когда начал прогонять на алгоритме, понял, что где то собака порылась, начал искать, сделал небольшой код для этого
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
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;
 
double func_de_jong (double, double);
 
int main(){
    setlocale(0,"");
    ofstream(out);
    out.open("01.txt");
    cout << "Start";
    for (int i = 0; i < 1000; i++){
        cout << ".";
        for (int j = 0; j < 1000; j++){
            double point1 = -5 + (double)i * .01;
            double point2 = -5 + (double)j * .01;
            out << "" << point1 << " " << point2 << " " << func_de_jong(point1,point2) << endl;
        }
    }
    out.close();
    cout << "Done!" << endl;
    double x = -1, y = 1.05;
    double a = 100 * (pow(x,2) - y);
    cout << "a = "<< a << endl;
    double b = pow((1 - x), 2);
    cout << "b = "<< b << endl;
    double c = a + b +1;
    cout << "c = "<< c << endl;
    double d = -100/c;
    cout << "d = "<< d << endl;
    double f = d + 100;
    cout << "f = "<< f << endl;
    getch();
    return 0;
}
double func_de_jong (double x, double y){
    double result = 0;
    result = (-100 / (100 * (pow((double)x,2) - y) + pow((double)(1 - x),2) + 1)) + 100;
    return result;
}
И вот обнаружил я следующий косяк, который и раньше всплывал, но я обошел его, как мне показалось, сменой типа переменной с float на double. А косяк следующий, при приближении результата вычислений к нулю, начинает вылезать какая то неведомая погрешность, числа превращаются вместо, например, 0,0001 в 0,0000999999996 и все идет наперекосяк. Например, эта функция при подсчетет руками не существует в точке (-1;1,05), т.к. в знаменателе получается 0, но программа выдает результат 2.2518e+016 ! Причем, что самое смешное, мне даже excel выдал такой же результат! Ко всему этому, в этой же точке, при выполнении вычислиней из цикла с записью в файл программа стабильно выдает результат -5,63E+15, т.е. ошибка получается 10^32! Честно говоря я вообще в шоке и не понимаю, что делать и как быть, и я ли дурак или это лыжи не едут.
Изображения
 
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.12.2011, 11:51
Ответы с готовыми решениями:

Графики - возникновение погрешностей при построении
Почему, при построение двух графиков в Matlab'е и в Excel'e получаются погрешности, точнее в Excel'e эти графики совпадают, а Matlab'е ...

Сборка игрового ПК с нуля (бюджет около 45 т.р.) + подбор монитора
Доброго всем времени суток. Последние 6 лет практически не следил за прогрессом компьютерного железа. Недавно решил все же заменить...

Графический редактор, построение правильных N-угольников, вписанных в окружность/описанных около нее
Доброго времени. Хотелось бы попросить вашего совета и помощи. Мне необходимо создать графический редактор и одно из подпунктов меню: ...

8
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
05.12.2011, 12:28
Цитата Сообщение от Woody-krsk Посмотреть сообщение
начинает вылезать какая то неведомая погрешность, числа превращаются вместо, например, 0,0001 в 0,0000999999996
Всё нормально, не пугайся. Вещественные числа почти всегда представлены с некоторой погрешностью. Поэтому сравнивать вещественные числа на "равно" практически бесполезно...

Не используй pow для возведения в квадрат. х*х будет и эффективнее и погрешность может меньше даже быть.
0
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
05.12.2011, 13:27  [ТС]
Пробовал, результат тот же. И что теперь делать то? Как мне эту функцию закодить? И главное, в чем причина разных результатов в консоли и в файле для той точки?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
05.12.2011, 13:43
http://gmplib.org/
0
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
06.12.2011, 06:58  [ТС]
А менее громоздких решений нет?

Добавлено через 7 минут
Громоздких в том плане, что не городить еще одну специальную библиотеку, а так сказать в стандартной комплектации VC?

Добавлено через 13 часов 42 минуты
Расскажите как библиотеку эту прикрутить, а то гугляма не помогает, документашка внутри тоже как-то молчит об этом.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
06.12.2011, 12:05
Я бы просто взял исходники, заточил бы под себя и - вперед.
Хлопот конечно много, но зато будешь владеть мощным инструментом, и все грабли машинной арифметики тебе по фигу.
Так как меня тоже интересует длинная арифметика (есть даже кой-какие наработки, но с только с целыми) я скачал gmp-5.0.2.tar.lz
Однако winRar его не берет. Очевидно, что это линуховский архив. Вот будет время, загружу Knoppix, разархивирую, об успехах сообщу.
0
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
06.12.2011, 18:20  [ТС]
Хм... У меня разархивировалось то все нормально, куда дальше приляпывать не пойму. Передеалть под себя не вариант, уровень мягко говоря не тот.
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
06.12.2011, 19:40
Цитата Сообщение от Woody-krsk Посмотреть сообщение
Хм... У меня разархивировалось то все нормально, куда дальше приляпывать не пойму. Передеалть под себя не вариант, уровень мягко говоря не тот.
Ты не мог заархивировать все обратно, каким-нибудь zip или rar и выложить это сюды, чтоб я мог это взять WinRar-ом. Если там есть исходники, попробую разобраться.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.12.2011, 11:23
Woody-krsk, IDE это чего такое? среда Visual Studio 2008
Вот и есть IDE (Integrated Development Environment) - Интегрированная среда разработки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2011, 11:23
Помогаю со студенческими работами здесь

Очистка содержимого DataGrid или запись в нее с нуля
Доброго времени суток! Подскажите пожалуйста, как полностью очистить содержимое DataGridView? Имеется следующая ситуация: в Базе данных...

Все компоненты загружены около 60%, но при этом игра выдает около 20 FPS
У меня ноутбук Lenovo 320 15 abr. ЦП: AMD a10 9620p, Видеокарта: 1. Radeon r5 graaphics, 2. Radeon R7 m400. ОЗУ 6 Гб, DRAM 960 Mhz. ...

Windows 7 устанавливается около суток и загружается около 15-20 мин
Проблема в том что виндовс 7 устанавливаться около суток а после установки грузиться от 15 до 20 минут. Говорю сразу дело не в загрузочном...

Загрузка первого ядра процессора около 95%, второго около 60%. Значит ли это, что он не тянет игру?
Ноутбук. Хар-ки: Процессор: Двухъядерный AMD Dual-Core C-60 (1.0 -1.33 ГГц) Графический адаптер: Интегрированный, AMD Radeon HD6290 ...

Отправка странных пакетов
Каждый раз при загрузке WinXP на некоторый (один и тот же) адрес уходит странная последовательность пакетов: ICMP 8-Echo - 8 шт (592...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru