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

Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли - C++

Восстановить пароль Регистрация
 
de-pre
32 / 31 / 3
Регистрация: 04.07.2013
Сообщений: 232
Записей в блоге: 1
12.07.2014, 14:15     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #1
Есть следующий код:
C++ (Qt)
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
47
48
49
50
51
#include <iostream>
#include <math.h>
#include <fstream>
using namespace std;
void filter(double x[],double y[],int N)
{
    int M = 10; //длина фильтра
    double prop = 20; //частота пропускания
    double zat = 50; //частота затухания
    double diskr = 50000; //частота дискретизации
    double H_real[M] ; //импульсная характеристика практическая
    double H_id[M] ; //идеальная импульсная характеристика
    double W[M] ; //весовая функция
    double fc = (prop + zat)/(2*diskr);
    for(int i = 0; i < M; i++)
    {
        if(i == 0) H_id[i] = 2*M_PI*fc;
        else H_id[i] = (sin(2*M_PI*fc*i))/M_PI*i;
        W[i] = 0.42 - 0.5*cos((2*M_PI*i)/M-1) + 0.08*cos((4*M_PI*i)/M-1); //весовая функция Блэкмана
        H_real[i] = H_id[i] * W[i]; //получили коэффициенты фильтра
    }
    for(int i = 0; i < N; i++)
    {
        y[i] = 0;
        for(int j = 0; j < M - 1; j++)
        {
          y[i] += H_real[j]*x[i-j];
        }
    }
}
 
int main()
{
    int N = 500;
    double x[N];
    double y[N];
    ofstream f;
    f.open("out.txt",ios::out);
    for(int i = 0; i < N; i++)
    {
        x[i] = 5*sin(0.75*M_PI*i);
    }
    filter(x,y,N);
 
    for(int i = 0;i < N;i++)
    {
        cout << y[i] << endl;
        f << y[i] << "," << endl;
    }
    f.close();
}
Я хочу сохранить в файл значения, которые записываются в массив y. Проблема в том, что часть чисел записывается с совсем противоположным знаком,чем они выводятся в консоли,а часть чисел вообще непонятного происхождения,и только числа ближе к концу файла походят на правильные. В чем проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2014, 14:15     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли
Посмотрите здесь:

C++ STL list<> помогите есть затруднение Совсем не пойму в чем дело!!!
С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? C++
Сделать подменю в консоли С++ часть 2 C++
Русские символы в консоли выводятся нормально, латиница - нет C++
C++ Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
orange_fox
 Аватар для orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
12.07.2014, 15:53     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #2
Цитата Сообщение от de-pre Посмотреть сообщение
int M = 10; //длина фильтра
Цитата Сообщение от de-pre Посмотреть сообщение
int N = 500;
Здесь должен быть const int, без понятия как у вас код скомпилировался

Добавлено через 2 минуты
Цитата Сообщение от de-pre Посмотреть сообщение
x[i] = 5*sin(0.75*M_PI*i);
M_PI в main не видно
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.07.2014, 16:03     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #3
de-pre, для M_PI нужен:
C++
1
#define _USE_MATH_DEFINES
А вот как скомпилировалось это - действительно вопрос.
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
12.07.2014, 17:23     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #4
Цитата Сообщение от orange_fox Посмотреть сообщение
без понятия как у вас код скомпилировался
variable length array
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.07.2014, 17:40     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #5
gromo, у вас компилируется исходный вариант?
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
12.07.2014, 17:42     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #6
nexen, да
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
12.07.2014, 17:44     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #7
Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
12.07.2014, 17:45     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #8
если компилить с флагом -gnu++11 (что по умолчанию в gcc) то и предупреждения исчезнут.
de-pre
32 / 31 / 3
Регистрация: 04.07.2013
Сообщений: 232
Записей в блоге: 1
15.07.2014, 01:01  [ТС]     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #9
Окей,я исправил так:
C++ (Qt)
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
47
48
49
50
51
52
#include <iostream>
#include <math.h>
#include <fstream>
#define _USE_MATH_DEFINES
using namespace std;
void filter(double x[],double y[],int N)
{
    const int M = 10; //длина фильтра
    double prop = 20; //частота пропускания
    double zat = 50; //частота затухания
    double diskr = 50000; //частота дискретизации
    double H_real[M] ; //импульсная характеристика практическая
    double H_id[M] ; //идеальная импульсная характеристика
    double W[M] ; //весовая функция
    double fc = (prop + zat)/(2*diskr);
    for(int i = 0; i < M; i++)
    {
        if(i == 0) H_id[i] = 2*M_PI*fc;
        else H_id[i] = (sin(2*M_PI*fc*i))/M_PI*i;
        W[i] = 0.42 - 0.5*cos((2*M_PI*i)/M-1) + 0.08*cos((4*M_PI*i)/M-1); //весовая функция Блэкмана
        H_real[i] = H_id[i] * W[i]; //получили коэффициенты фильтра
    }
    for(int i = 0; i < N; i++)
    {
        y[i] = 0;
        for(int j = 0; j < M - 1; j++)
        {
          y[i] += H_real[j]*x[i-j];
        }
    }
}
 
int main()
{
    const int N = 500;
    double x[N];
    double y[N];
    ofstream f;
    f.open("out.txt",ios::out);
    for(int i = 0; i < N; i++)
    {
        x[i] = 5*sin(0.75*M_PI*i);
    }
    filter(x,y,N);
 
    for(int i = 0;i < N;i++)
    {
        cout << y[i] << endl;
        f << y[i] << "," << endl;
    }
    f.close();
}
Часть цифр по - прежднему записывается неправильно.
olper
24 / 24 / 11
Регистрация: 02.12.2013
Сообщений: 75
15.07.2014, 02:52     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #10
мне право не ловко
C++
1
2
cout <<i<<" " <<y[i] << endl;
f <<i<<" "<< y[i] << "," << endl;
в таком варианте можно выложить для сравнения несколько фрагментов.
у меня все собирается и вывод одинаковый.
Вы, скорей всего, серьезно прогневили богов Qt
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.07.2014, 03:20     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #11
Цитата Сообщение от orange_fox Посмотреть сообщение
M_PI в main не видно
acos(-1.)
de-pre
32 / 31 / 3
Регистрация: 04.07.2013
Сообщений: 232
Записей в блоге: 1
15.07.2014, 03:41  [ТС]     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #12
Хм,теперь,когда напротив каждого элемента стоит порядковый номер,видно,что в консоли показаны номера,начиная с 204 - ого, а в файле - начиная с нулевого. Ну а те,что начинаются с 204 - ого, вроде совпадают.
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,207
Завершенные тесты: 1
15.07.2014, 08:06     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #13
Цитата Сообщение от de-pre Посмотреть сообщение
показаны номера,начиная с 204
Консоль не резиновая,
когда выводится много, то часть информации пропадает.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
15.07.2014, 08:19     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #14
В 27-й строке самого первого кода при i = 0 и j = 8 какой элемент массива x адресуется?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2014, 11:12     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли
Еще ссылки по теме:

В консоли вместо русского языка выводятся вопросительные знаки C++
Написал программу, но она что-то не совсем то, выдает, не могу понять в чем проблема C++
Ввести с консоли три символа. Проверить, образуют ли они число C++

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

Или воспользуйтесь поиском по форуму:
olper
24 / 24 / 11
Регистрация: 02.12.2013
Сообщений: 75
15.07.2014, 11:12     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли #15
Цитата Сообщение от de-pre Посмотреть сообщение
в консоли показаны номера,начиная с 204
В таких ситуациях лучше снять галочку "запускать в терминале". В консоль среды "больше влазит"
Yandex
Объявления
15.07.2014, 11:12     Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли
Ответ Создать тему
Опции темы

Текущее время: 22:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru