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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Woody-krsk
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
#1

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

05.12.2011, 11:51. Просмотров 655. Ответов 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! Честно говоря я вообще в шоке и не понимаю, что делать и как быть, и я ли дурак или это лыжи не едут.
Изображения
 
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2011, 11:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возникновение странных погрешностей около нуля и возникающие из-за нее косяки (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
05.12.2011, 12:28 #2
Цитата Сообщение от Woody-krsk Посмотреть сообщение
начинает вылезать какая то неведомая погрешность, числа превращаются вместо, например, 0,0001 в 0,0000999999996
Всё нормально, не пугайся. Вещественные числа почти всегда представлены с некоторой погрешностью. Поэтому сравнивать вещественные числа на "равно" практически бесполезно...

Не используй pow для возведения в квадрат. х*х будет и эффективнее и погрешность может меньше даже быть.
Woody-krsk
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
05.12.2011, 13:27  [ТС] #3
Пробовал, результат тот же. И что теперь делать то? Как мне эту функцию закодить? И главное, в чем причина разных результатов в консоли и в файле для той точки?
Байт
Эксперт C
15984 / 10252 / 1536
Регистрация: 24.12.2010
Сообщений: 19,339
05.12.2011, 13:43 #4
http://gmplib.org/
Woody-krsk
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
06.12.2011, 06:58  [ТС] #5
А менее громоздких решений нет?

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

Добавлено через 13 часов 42 минуты
Расскажите как библиотеку эту прикрутить, а то гугляма не помогает, документашка внутри тоже как-то молчит об этом.
Байт
Эксперт C
15984 / 10252 / 1536
Регистрация: 24.12.2010
Сообщений: 19,339
06.12.2011, 12:05 #6
Я бы просто взял исходники, заточил бы под себя и - вперед.
Хлопот конечно много, но зато будешь владеть мощным инструментом, и все грабли машинной арифметики тебе по фигу.
Так как меня тоже интересует длинная арифметика (есть даже кой-какие наработки, но с только с целыми) я скачал gmp-5.0.2.tar.lz
Однако winRar его не берет. Очевидно, что это линуховский архив. Вот будет время, загружу Knoppix, разархивирую, об успехах сообщу.
Woody-krsk
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
06.12.2011, 18:20  [ТС] #7
Хм... У меня разархивировалось то все нормально, куда дальше приляпывать не пойму. Передеалть под себя не вариант, уровень мягко говоря не тот.
Байт
Эксперт C
15984 / 10252 / 1536
Регистрация: 24.12.2010
Сообщений: 19,339
06.12.2011, 19:40 #8
Цитата Сообщение от Woody-krsk Посмотреть сообщение
Хм... У меня разархивировалось то все нормально, куда дальше приляпывать не пойму. Передеалть под себя не вариант, уровень мягко говоря не тот.
Ты не мог заархивировать все обратно, каким-нибудь zip или rar и выложить это сюды, чтоб я мог это взять WinRar-ом. Если там есть исходники, попробую разобраться.
Байт
Эксперт C
15984 / 10252 / 1536
Регистрация: 24.12.2010
Сообщений: 19,339
09.12.2011, 11:23 #9
Woody-krsk, IDE это чего такое? среда Visual Studio 2008
Вот и есть IDE (Integrated Development Environment) - Интегрированная среда разработки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2011, 11:23
Привет! Вот еще темы с ответами:

Цепочка странных ошибок - C++ Builder
Работал над программкой, после очередной компиляции появилась одна ошибка. Решил её удалив резервную форму (да, мне она нужна была). После...

Дилемы, возникающие по ходу изучения С# - C#
Здравствуйте, иногда возникают вопросы на которые не могу найти ответа в книгах. 1. Какой смысл создавать свойства(они обеспечивают...

Очень много странных вещей - Удаление вирусов
Добрый ... киберангелы ! сегодня я зашла в инет и увидела надпись про флеш плеер , это сайт на хостинге - скрипт покупала и раньше он...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.12.2011, 11:23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru