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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.58
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 440
#1

Умножение и деление - C++

08.07.2013, 17:36. Просмотров 1600. Ответов 39
Метки нет (Все метки)

Представьте себе числовой массив первым элементом равным begin. Если далее к нему мы будем прибавлять step пока не достигнем end то сформируем массив. Таким образом размер такого массива будет вычисляться по формуле
C++
1
size = static_cast<size_t>((end - begin) / step) + 1;
а последний элемент можно будет найти по формуле
C++
1
last = min + step * (size - 1);
Всё бы ничего но иногда отрезок делится на step целое число раз начинаются проблемы: из-за погрешности операций над вещественными числами в каком-то бородатом знаке после запятой результат деления оказывается чуть меньше целого числа, т. е., например, если begin = 1.0, end = 3.0, step = 1.0, при делении может оказаться что (end - begin) / step = 1.99999999999, в результате мы получим size = 2, хотя в массиве должны быть 1.0, 2.0 и 3.0. Безграмотное решение:
C++
1
size = static_cast<size_t>((end - begin) / step + 1e-8) + 1;
Вопрос к знатокам всяких там <cfloat> и <limits>: как это сделать грамотно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2013, 17:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Умножение и деление (C++):

Чем заменить умножение и деление? - C++
Пожалуйста, подскажите, как выполнить следующие действия в С++, не используя умножениe и деление. Напишите программу, вычисляющую...

Вычитание, умножение, деление столбиком - C++
дано мне в классе 2 числа представленные в виде массивов. вот..для них у меня должны быть перегрузки операций сложения,вычитания,умножения...

Умножение и деление целого числа - C++
1. Напишите программу, в которой умножение и деление целого числа на {2}^{n} реализуется при помощи логических сдвигов.

Оптимизирует ли компилятор деление/умножение double? - C++
Если я пишу double d = ...; for( ...; ...; d *= 2 ) ... или for( ...; ...; d /= 2 ) ... будет ли компилятор...

Нестандартное сложение, вычитание, умножение и деление - C++
Что-то на форуме скучно, давайте устроим небольшой интерактивчик, придумываем самые нестандартные способы сложения, вычитания, умножения и...

Сложение и вычитание, умножение и деление, сравнение сумм - C++
Уважаемые форумчане! помогите, пожалуйста, нужно написать программу для работы с устаревшей денежной системой Великобритании. В ней...

39
Nomadd
14 / 9 / 0
Регистрация: 12.07.2012
Сообщений: 82
08.07.2013, 17:59 #2
Но почему не используется целочисленный тип?
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 440
08.07.2013, 18:02  [ТС] #3
какой целочисленный тип? о чем вы? Мне нужно описать произвольный интервал данных. от e до pi к примеру... с шагом log(0.1)
0
Avyyakta
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 19
08.07.2013, 18:05 #4
Цитата Сообщение от CEBEP Посмотреть сообщение
...
C++
1
size = static_cast<size_t>((end - begin) / step) + 1;
...
C++
1
size = static_cast<size_t>((end - begin) / step + 1e-8) + 1;
Вопрос к знатокам всяких там <cfloat> и <limits>: как это сделать грамотно?
C++
1
size = (size_t)((end - begin) / step) + 1;
Кто же тебя надоумил кастовать по статик? Простое преобразование должно решить твою проблему.
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 440
08.07.2013, 18:11  [ТС] #5
Цитата Сообщение от Avyyakta Посмотреть сообщение
Простое преобразование должно решить твою проблему.
типа (int)? чем от отличается? в с++ он просто вызывает последовательно несколько кастов.
0
zenw
154 / 110 / 3
Регистрация: 12.06.2013
Сообщений: 168
08.07.2013, 18:12 #6
Цитата Сообщение от Avyyakta Посмотреть сообщение
Кто же тебя надоумил кастовать по статик? Простое преобразование должно решить твою проблему.
Гражданин, пройдите в сторону чистого С. В топике про С++ вам не место.
0
Avyyakta
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 19
08.07.2013, 18:33 #7
Цитата Сообщение от zenw Посмотреть сообщение
Гражданин, пройдите в сторону чистого С. В топике про С++ вам не место.
Отчего же?
Просто парень не знает, что статик каст не преобразует данные.
Кастование создано для того чтобы изменять области видимости компилятором, а не для преобразования данных.
И size_t это вовсе не int (по крайней мере в C++), хотя также целочисленно.
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 440
08.07.2013, 19:04  [ТС] #8
Цитата Сообщение от Avyyakta Посмотреть сообщение
Кастование создано для того чтобы изменять области видимости компилятором
действительно не знаю. Чем это отличается от приведения типов?

Добавлено через 1 минуту
обычно касты используют при работе с указателями, я думал тут дело в том, что при работе с переменными отличие кастов от приведения типов в стиле си не существенно. однако, я много раз видел, например в qt, чтобы там приводили именно переменные к нужному типу с помощью кастов

Добавлено через 2 минуты
проверил, если написать
C
1
s = (size_t)((end - begin) / step) + 1;
то проблема не решается.
0
Avyyakta
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 19
08.07.2013, 19:14 #9
Цитата Сообщение от CEBEP Посмотреть сообщение
действительно не знаю. Чем это отличается от приведения типов? насчет int - просто был не уверен что в си есть size_t. Везде где я работал он просто unsigned int...
Все зависит от компилятора... В моем любимои GNU С++ ver. 4 size_t это unsigned long.
Цитата Сообщение от CEBEP Посмотреть сообщение
обычно касты используют при работе с указателями, я думал тут дело в том, что при работе с переменными отличие кастов от приведения типов в стиле си не существенно. однако, я много раз видел, например в qt, чтобы там приводили именно переменные к нужному типу с помощью кастов
В Qt данные преобразуются до кастов, а указывая тип в кастовании просто определяют размер участка памяти к котрому обращаются. Это часто применяется в Qt. Да и кастование в Qt в основном применяется для указателей, а не для результатов вычислений.

Добавлено через 3 минуты
Цитата Сообщение от CEBEP Посмотреть сообщение
проверил, если написать
C
1
s = (size_t)((end - begin) / step) + 1;
то проблема не решается.
Извини забыл округление
C
1
s = (size_t)((end - begin) / step + 0.5) + 1;
Щто там у тебя за компилятор такой?
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 440
08.07.2013, 20:41  [ТС] #10
Цитата Сообщение от Avyyakta Посмотреть сообщение
Щто там у тебя за компилятор такой?
MinGW,
Как-раз хотел в начале написать... округление тут не при чем. проблема не связана с округлением. При параметрах min = 0.0, max = 2.0, step = 1.1, last должно быть 1.1, в данной постановке оно получится 2.2
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
08.07.2013, 21:03 #11
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
 
int main(void)
{
    double begin = 1.0, end = 3.0, step = 1.0;
    int size = (end - begin) / step + 1.0;
    cout << size;
    return 0;
}
3
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 440
08.07.2013, 21:04  [ТС] #12
Цитата Сообщение от Olivеr Посмотреть сообщение
3
ну да, но это просо прецедент. просто в данном случае погрешность положительная и число (end - begin) / step оказалось немного больше двух. При минимуме = 1e-4, максимуме = 1., и шаге = 5.0e-6 результат вычисления неверный
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
08.07.2013, 21:10 #13
CEBEP, в смысле? Вы писали
Цитата Сообщение от CEBEP Посмотреть сообщение
в результате мы получим size = 2, хотя в массиве должны быть 1.0, 2.0 и 3.0.
Разве не 1.0, 2.0, 3.0 ?

Добавлено через 5 минут
Цитата Сообщение от CEBEP Посмотреть сообщение
ну да, но это просо прецедент. просто в данном случае погрешность положительная и число (end - begin) / step оказалось немного больше двух. При минимуме = 1e-4, максимуме = 1., и шаге = 5.0e-6 результат вычисления неверный
у вас какой результат получается?
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 440
08.07.2013, 21:11  [ТС] #14
Цитата Сообщение от Olivеr Посмотреть сообщение
у вас какой результат получается?
0.999995
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
08.07.2013, 21:13 #15
Ищите проблему у себя
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main(void)
{
    double begin = 1e-4, end = 1.0, step = 5.0e-6;
    int size = (end - begin) / step + 1.0;
    cout << "int size = " << size;
    double x = (1.0-1.0/10000.0) / (5.0 / 1000000.0) + 1.0;
    cout << "\ndoble size = " << x;
    return 0;
}
0
Миниатюры
Умножение и деление  
08.07.2013, 21:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2013, 21:13
Привет! Вот еще темы с ответами:

Умножение/деление длинных целых чисел из строк - C++
у кого есть код 'умножение и деление целых чисел из строк'? заранее спасибо Добавлено через 32 минуты или библиотека и функции

Сделать сложение, вычитание, умножение и деление длинных чисел - C++
В общем, задача такая, что надо сделать сложение, вычитание, умножение и деление длинных чисел. Сумму сделал, с вычитанием какая-то засада....

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

Написать программу для работы с двоичными числами (сумма, вычитание, умножение и деление) - C++
Доброго времени суток. Задание такое: Разработать программный продукт для осуществления арифметических операций над двоичными числами. При...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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