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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
#1

Функция округления чисел - C++

25.04.2013, 14:11. Просмотров 1401. Ответов 25
Метки нет (Все метки)

Здравствуйте, подскажите пожалуйста. Написала функцию округления цифр

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void RoundingFunction(double RoundingVariable, int& ResultVariable)
{
    double IntegerPart=0;
    ResultVariable=0;
    if (modf(abs(RoundingVariable),&IntegerPart)<=0.5)
    {
        if (RoundingVariable>0)
            ResultVariable=floor(RoundingVariable);
        else
            ResultVariable=ceil(RoundingVariable);
    }
    else
    {
        if (RoundingVariable>0)
            ResultVariable=ceil(RoundingVariable);
        else
            ResultVariable=floor(RoundingVariable);
    }
}
И вот мне интересно, возможен ли такой вариант, при вызове функции передать туда элемент динамического массива? Например:

C++
1
RoundingFunction(IndexRho,IndexRhoM[i*column+j]);
Когда компилируешь ошибок нет. Но стоит попытаться использовать массив IndexRhoM, он выдает мне необработанное исключение, при чем ссылается на эту функцию. Подскажите. Можно ли так сделать? Кстати, он выдает мне warning в этой функции так как по сути я присваиваю целому значению double значение.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2013, 14:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция округления чисел (C++):

Функция округления double - C++
Как в С++ округлить double до int? С помощью какой функции?

Функция округления вещественного числа с заданой точностью - C++
Написать функцию,которая принимает в качестве параметров вещественное число и количество знаков после десятичной точки,которые должны...

Функция floor для округления значения до определённого числа знаков дробной части - C++
Всем привет ребята. кто мог бы объяснить где и что неправильно у меня в коде и как это исправить. Благодарю за внимание. Условие задачи:...

Как избежать округления дробных чисел - C++
как сделать что бы не округляло ??? float t; float z,m; using namespace std; void main(void) { m=-pow(5,2)/2;

Как избежать округления дробных чисел - C++
не виводит дробь а только целие числа. где проблема ? #include &lt;iostream.h&gt; #include &lt;math.h&gt; int mat(double x,double y){ ...

Функция возвращающая абсолютное разницу первого и второго параметров и функция типа int, возвращающая минимальное из трех целых чисел - C++
Разработать заданные согласно условия функции и сделать в главной программе по два вызова этих функций с различными параметрами. Для...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 15:12 #2
Цитата Сообщение от Eumi Посмотреть сообщение
Но стоит попытаться использовать массив IndexRhoM, он выдает мне необработанное исключение, при чем ссылается на эту функцию.
Приведите пример вызова.
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 15:29  [ТС] #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Приведите пример вызова.
C++
1
2
for (i=0; i<n; i++)
        HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]=HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]+Gradient[i];
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 15:38 #4
Eumi, и где тут RoundingFunction?
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 15:59  [ТС] #5
Цитата Сообщение от Tulosba Посмотреть сообщение
Eumi, и где тут RoundingFunction?
я показала на первом посте вызов. Вот еще раз и поподробнее. IndexRhoM,IndexThetaN - динамические массивы
C++
1
2
3
4
5
6
7
8
9
10
11
for (i=0; i<row; i++)
        for (j=0;j<column;j++)
        {
            double IndexRho=0;
            double IndexTheta=0;
            IndexRho=2*MaxRho-(MaxRho-RhoPolarCoordinate[i*column+j])*(MaxRho-1)/(2*MaxRho);
            IndexTheta=360-((180-ThetaPolarCoordinate[i*column+j])*359/360);
            RoundingFunction(IndexRho,IndexRhoM[i*column+j]);
            RoundingFunction(IndexTheta,IndexThetaN[i*column+j]);
            
        }
все ок, ошибок нет. Но стоит написать эти строчки как сразу необработанное исключение, указывая на функцию округления

C++
1
2
    for (i=0; i<n; i++) 
                 HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]=HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]+Gradient[i];
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
25.04.2013, 16:02 #6
Цитата Сообщение от Eumi Посмотреть сообщение
IndexRhoM,IndexThetaN - динамические массивы
покажи как создаешь
Двумерные?

Цитата Сообщение от Eumi Посмотреть сообщение
[i*column+j]
почему так?
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 16:12  [ТС] #7
Цитата Сообщение от ValeryS Посмотреть сообщение
покажи как создаешь
Двумерные?


почему так?
C++
1
2
int* IndexRhoM=new int[row*column];
int* IndexThetaN=new int[row*column];
да, двумерные=)
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 16:16 #8
Цитата Сообщение от Eumi Посмотреть сообщение
да, двумерные=)
это не двумерные, это имитация двумерности, создавая одномерный определенной длины.
И ещё, хочу обратить Ваше внимание на целочисленное деление, типа 359/360, вы не получите того, что ожидаете.
По изначальной проблеме, мне кажется у Вас много путаницы в коде, учитывая "двумерные" массивы. Поэтому рекомендую привести весь код, который можно было бы собрать. Если хотите чтобы Ваша проблема была решена в кратчайшие сроки
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 16:28  [ТС] #9
Цитата Сообщение от Tulosba Посмотреть сообщение
это не двумерные, это имитация двумерности, создавая одномерный определенной длины.
И ещё, хочу обратить Ваше внимание на целочисленное деление, типа 359/360, вы не получите того, что ожидаете.
По изначальной проблеме, мне кажется у Вас много путаницы в коде, учитывая "двумерные" массивы. Поэтому рекомендую привести весь код, который можно было бы собрать. Если хотите чтобы Ваша проблема была решена в кратчайшие сроки
в том то и смысл что я получаю не целое число, а мне надо округлить в нужную сторону и создать массив. целых чисел. я могу привести код конкретно этой функции, в которой все это происходит, потому что если показывать вся программа очень большая. Эта функция тоже не маленькая. Если понадобиться могу написать комментарии

Кликните здесь для просмотра всего текста
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
void HoughTransform(double* Gradient, double* EdgeAngleArray, double*& HoughTransformArray, int row, int column, int MaxTheta, int& MaxRhoInt)
{
    int i=0;
    int j=0;
    double* AnglePhi;//Phi=arctg(y/x)
    double* ThetaPolarCoordinate;
    double* RhoPolarCoordinate;
    AnglePhi=new double[row*column];
    ThetaPolarCoordinate=new double[row*column];
    RhoPolarCoordinate=new double[row*column];
    for (i=0; i<row; i++)//working with edge gradient angle
        for (j=0;j<column;j++)
        {
            if ((EdgeAngleArray[i*column+j]<90)&&(EdgeAngleArray[i*column+j]>=-90))
                EdgeAngleArray[i*column+j]=EdgeAngleArray[i*column+j]+90;
            else if ((EdgeAngleArray[i*column+j]>=90)&&(EdgeAngleArray[i*column+j]<180))
                EdgeAngleArray[i*column+j]=EdgeAngleArray[i*column+j]-90;
            else if ((EdgeAngleArray[i*column+j]>=-180)&&(EdgeAngleArray[i*column+j]<-90))
                EdgeAngleArray[i*column+j]=EdgeAngleArray[i*column+j]+270;
 
            if (j==0)
                AnglePhi[i*column+j]=90;
            else
                AnglePhi[i*column+j]=atan(i/j)*180/PI;//arctang(y/x)
 
            if (EdgeAngleArray[i*column+j]<AnglePhi[i*column+j])
                ThetaPolarCoordinate[i*column+j]=EdgeAngleArray[i*column+j]+90;
            else
                ThetaPolarCoordinate[i*column+j]=EdgeAngleArray[i*column+j]-90;
            RhoPolarCoordinate[i*column+j]=j*cos(ThetaPolarCoordinate[i*column+j])+i*sin(ThetaPolarCoordinate[i*column+j]);//rho=x*cos(theta)+y*sin(theta)
        }
    i=0;
    j=0;
    double MaxRho=RhoPolarCoordinate[0];//for finding max rho
    for (i=0; i<row; i++)
        for (j=0;j<column;j++)
        {
            if (RhoPolarCoordinate[i*column+j]>MaxRho)
                MaxRho=RhoPolarCoordinate[i*column+j];
        }
    RoundingFunction(MaxRho,MaxRhoInt);
    AlocatePicture(HoughTransformArray, MaxRhoInt, MaxTheta);
    i=0;
    j=0;
    int* IndexRhoM=new int[row*column];
    int* IndexThetaN=new int[row*column];
    for (i=0; i<row; i++)
        for (j=0;j<column;j++)
        {
            double IndexRho=0;
            double IndexTheta=0;
            IndexRho=2*MaxRho-(MaxRho-RhoPolarCoordinate[i*column+j])*(MaxRho-1)/(2*MaxRho);
            IndexTheta=360-((180-ThetaPolarCoordinate[i*column+j])*359/360);
            RoundingFunction(IndexRho,IndexRhoM[i*column+j]);
            RoundingFunction(IndexTheta,IndexThetaN[i*column+j]);
            
        }
    i=0;
    j=0;
    for (i=0;i<MaxRhoInt;i++)
        for (j=0;j<MaxTheta;j++)
                HoughTransformArray[i*360+j]=0;
    int n=column*row;
    i=0;
    j=0;
    for (i=0; i<n; i++)
            HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]=HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]+Gradient[i];
    
    delete []AnglePhi;
    delete []ThetaPolarCoordinate;
    delete []RhoPolarCoordinate;
    delete []IndexRhoM;
    delete []IndexThetaN;
}
 
void RoundingFunction(double RoundingVariable, int& ResultVariable)
{
    double IntegerPart=0;
    ResultVariable=0;
    if (modf(abs(RoundingVariable),&IntegerPart)<=0.5)
    {
        if (RoundingVariable>0)
            ResultVariable=floor(RoundingVariable);
        else
            ResultVariable=ceil(RoundingVariable);
    }
    else
    {
        if (RoundingVariable>0)
            ResultVariable=ceil(RoundingVariable);
        else
            ResultVariable=floor(RoundingVariable);
    }
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 17:04 #10
С какими аргументами вызывается HoughTransform() ?
В коде у Вас слишком всё замешано.
А ещё при вызове
C++
1
abs(RoundingVariable)
скорее всего потеряется дробная часть.
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 17:24  [ТС] #11
Цитата Сообщение от Tulosba Посмотреть сообщение
С какими аргументами вызывается HoughTransform() ?
В коде у Вас слишком всё замешано.
А ещё при вызове
C++
1
abs(RoundingVariable)
скорее всего потеряется дробная часть.
а разве abs это не обычный модуль? то есть по сути просто должен знак убирать? Вот вызов, простите комментарии на английском=)

C++
1
2
3
4
5
6
7
8
    /*
    ArrayGradient - result after gradient method - динамический массив
    ArrayEdgeAngle - edge angles after gradient method - динамический массив
    HoughTransformArray - resulting array after Hought transform - результирующий динамический массив
    RowGradient, ColumnGradient - numbers of  rowas and columns in input array - размеры динамического массива, количество строк и столбцов
    MaxTheta = 360 degrees is constant,MaxRhoInt = 0 - numbers of rows in resulting array define in the function - размеры результирующего массива, MaxRhoInt - определяется в функции
    */
    HoughTransform(ArrayGradient,ArrayEdgeAngle, HoughTransformArray, RowGradient, ColumnGradient, MaxTheta,MaxRhoInt);
Добавлено через 2 минуты
Попробую тогда обойтись без модуля=) напишу быстренько другую функцию
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 17:35 #12
Цитата Сообщение от Eumi Посмотреть сообщение
а разве abs это не обычный модуль?
Зависит от того какая функция используется
Для целых: http://www.cplusplus.com/reference/cstdlib/abs/
Для вещественных: http://www.cplusplus.com/reference/cmath/abs/

Цитата Сообщение от Eumi Посмотреть сообщение
Вот вызов, простите комментарии на английском=)
Значения нужны (цифры), а не комментарии
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 17:36  [ТС] #13
Сделала вот так вот, на одно исключение меньше. Но все равно есть=(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void RoundingFunction(double RoundingVariable, long& ResultVariable)
{
    double IntegerPart=0;
    ResultVariable=0;
    if (RoundingVariable>0)
    {
        if (modf(RoundingVariable,&IntegerPart)<=0.5)
            ResultVariable=floor(RoundingVariable);
        else
            ResultVariable=ceil(RoundingVariable);
    }
    else if (RoundingVariable<0)
    {
        if (modf(RoundingVariable,&IntegerPart)<=-0.5)
            ResultVariable=floor(RoundingVariable);
        else
            ResultVariable=ceil(RoundingVariable);
    }
    else
        ResultVariable=0;
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 17:40 #14
Цитата Сообщение от Eumi Посмотреть сообщение
он выдает мне необработанное исключение
Что пишет-то, скриншот можно? Или скиньте уже куда-нибудь проект полностью.
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 17:43  [ТС] #15
Цитата Сообщение от Tulosba Посмотреть сообщение
Зависит от того какая функция используется
Для целых: http://www.cplusplus.com/reference/cstdlib/abs/
Для вещественных: http://www.cplusplus.com/reference/cmath/abs/


Значения нужны (цифры), а не комментарии
Я прикрепила файлы, программа считывает матрицы с них, определяет размеры, а потом передает все данные в функцию.

ArrayGradient - EdgeGradient.txt
ArrayEdgeAngle - EdgeAngle.txt
HoughTransformArray =NULL на входе
RowGradient, ColumnGradient = 5 - зависит от матрицы в текстовом файле
MaxTheta = 360 - остается неизменным
MaxRhoInt = 0 - определяется уже в самой функции, после подсчета
Вложения
Тип файла: txt EdgeGradient.txt (53 байт, 4 просмотров)
Тип файла: txt EdgeAngle.txt (76 байт, 4 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2013, 17:43
Привет! Вот еще темы с ответами:

Чудеса округления - C++
Не могу посчитать i-ый член по формуле разности Ньютона (см. прикреплённый файл). Из-за округления я не могу получить члены после j...

Метод округления числа - C++
Метод округления числа введонного с клавиатуры. Например вводим 2,5 , а выводит 3 ;

Как избавиться от округления - C++
Доброго времени суток. У меня следующая проблема. pp = 0.1534886 + 151.5235 - 0.15668835467; pp имеет тип double, но в качестве...

Каковая точность округления? - C++
Какова точность округления у таких функций, как round/ceil/floor? Сколько раз я могу просуммировать число с погрешностью (имеется ввиду,...


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

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

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