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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Создать класс, для работы с динамическими векторами http://www.cyberforum.ru/cpp-beginners/thread399163.html
Создать класс, для работы с динамическими векторами, длины n. В классе реализовать операцию вычитания векторов ввода и вывода данных в поток. проверить работу соответствующих операций.
C++ Задача про матрицу Вообщем завтра сдать надо бы по хорошему. Мне осталось сделать 1 задачу, которую я не знаю как делать. Может напишет кто-нибудь, пожалуйста? Надо заюзать массивы Написать программу, которая принимает с клавиатуры число N, задает квадратную матрицу размера N на N, со-стоящую из целых случайных чисел и выводит ее. Затем необходимо определить номер столбца, сумма элементов в котором минимальна... http://www.cyberforum.ru/cpp-beginners/thread399159.html
Построение программ - фильтров C++
Разработать программу, которая читает текстовый файл стандартного ввода (stdin) и подсчитывает количество цифр и символов '+' (плюс) и символов '- '(минус). Результат записать в стандартный поток вывода (stdout).
C++ Массив в динамической памяти
Помогите написать прогу в динамической памяти #include<iostream.h> #include<conio.h> #define N 10 void novmas (int A,int B) { int x; for (int i=0; i<N; i++)
C++ redefinition of class http://www.cyberforum.ru/cpp-beginners/thread399150.html
Даже не могу предположить что не так, наверняка ошибка глупая, подскажите подалуйста ASTManage/SvcHandler.h:27:9: error: redefinition of ‘class CAST::SvcHandler’ ASTManage/SvcHandler.h:27:9: error: previous definition of ‘class CAST::SvcHandler’ ASTManage/SvcHandler.h:74:9: error: redefinition of ‘class CAST::SockHandler’ ASTManage/SvcHandler.h:74:9: error: previous definition of ‘class...
C++ неправильно работает программа на с++. вычислить произведение и число отрицательных элементов матрицы А,находящихся под главной диагональю. #include <vcl.h> #pragma hdrstop #include <iostream.h> #include <conio.h> #include <iomanip.h> //--------------------------------------------------------------------------- #pragma argsused подробнее

Показать сообщение отдельно
Woody-krsk
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62

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

05.12.2011, 11:51. Просмотров 647. Ответов 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! Честно говоря я вообще в шоке и не понимаю, что делать и как быть, и я ли дурак или это лыжи не едут.
Изображения
 
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru