Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
57 / 40 / 21
Регистрация: 26.09.2018
Сообщений: 215

некорректное сравнение дробей

30.07.2019, 16:35. Показов 1817. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Следующий код работает не так, как предполагалось:
C++
1
2
3
4
5
6
7
8
double __rD(double d, int symAPt) { // round double
    symAPt = pow(10, symAPt);
    return static_cast<double>(static_cast<long long>(d * symAPt)) / symAPt;
}
bool equal(double a, double b, int pr) {
    bool r = (__rD(a, pr) == __rD(b, pr));
    return r; 
}
Вызываю:
C++
1
cout << equal(22.0 / 7.0, 3.1415926, 2);
Пишет 0.
И даже так:
C++
1
cout << equal(3.14, 3.14, 2);
Где ошибка понять не могу.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.07.2019, 16:35
Ответы с готовыми решениями:

Сравнение дробей
Здравствуйте, очень нужна ваша помощь. Помогите, пожалуйста с сравнение дробями. больше, меньше, равно. #include &quot;stdafx.h&quot;...

Сравнение двух дробей на равенство
Помогите в код добавить функцию сравнение двух дробей на равенство и умножение и сложение дроби с целым числом. Заранее спасибо. #include...

Найти сравнение методом цепных дробей
67x\equiv 64 (mod183) 183=67\cdot2+49 67=11\cdot6+1 11=9\cdot1+2 9=2\cdot4+1 2=1\cdot2 ...

8
Модератор
 Аватар для Curry
5158 / 3487 / 536
Регистрация: 01.06.2013
Сообщений: 7,567
Записей в блоге: 9
30.07.2019, 16:53
C++
1
2
3
4
double __rD(double d, int symAPt) { // round double
    double div = pow(10, symAPt);
    return floor (d * div + div / 2) / div;
}
Добавлено через 53 секунды
Хотя equal(3.14, 3.14, 2) и в вашем варианте 1 у меня.
0
57 / 40 / 21
Регистрация: 26.09.2018
Сообщений: 215
30.07.2019, 16:58  [ТС]
Все равно 0 выводит

Добавлено через 4 минуты
кстати див пополам не нужен, у меня скорее не округление а просто отбрасывание последних знаков
0
279 / 88 / 37
Регистрация: 10.06.2015
Сообщений: 261
30.07.2019, 17:01
Не проверяй на равенство два числа с плавающей точкой никогда. Шансов получить то, что хочется, маловато.
Цитата Сообщение от Curry Посмотреть сообщение
Хотя equal(3.14, 3.14, 2) и в вашем варианте 1 у меня.
У меня так и equal(22.0 / 7.0, 3.1415926, 2) - "1".
0
Модератор
 Аватар для Curry
5158 / 3487 / 536
Регистрация: 01.06.2013
Сообщений: 7,567
Записей в блоге: 9
30.07.2019, 17:07
Цитата Сообщение от coder0 Посмотреть сообщение
Все равно 0 выводит
У вас чего то не той в остальной части программы, вы же всё не показываете. Попробуйте
C++
1
2
3
4
bool equal(double a, double b, int pr) {
    double m = pow(10, pr);
    return  floor(a*m) == floor(b*m);
}
1
57 / 40 / 21
Регистрация: 26.09.2018
Сообщений: 215
30.07.2019, 18:24  [ТС]
Да, работает, спасибо. Но все же хочется понять почему мой код не работает.

Добавлено через 40 секунд
Цитата Сообщение от Curry Посмотреть сообщение
У вас чего то не той в остальной части программы, вы же всё не показываете. Попробуйте
У меня ничего больше в программе нет.
0
Модератор
 Аватар для Curry
5158 / 3487 / 536
Регистрация: 01.06.2013
Сообщений: 7,567
Записей в блоге: 9
30.07.2019, 18:32
Цитата Сообщение от coder0 Посмотреть сообщение
Но все же хочется понять почему мой код не работает.
Не знаю почему он у вас не работает
http://ideone.com/9vYxQK
Цитата Сообщение от coder0 Посмотреть сообщение
У меня ничего больше в программе нет.
Есть, есть. Там ещё есть #include, main.
0
57 / 40 / 21
Регистрация: 26.09.2018
Сообщений: 215
31.07.2019, 21:07  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cmath>
using namespace std;
 
double __rD(double d, int symAPt) { // round double
    symAPt = pow(10, symAPt);
    return static_cast<double>(static_cast<long long>(d * symAPt)) / symAPt;
}
bool equal(double a, double b, int pr) {
    bool r = (__rD(a, pr) == __rD(b, pr));
    return r; 
}
 
int main(int argc, char *argv[]) {
     cout << equal(22.0 / 7.0, 3.1415926, 2) << endl;
          << equal(3.14, 3.14, 2) << endl;
     return 0;
}
Больше ничего нет, код в отдельный проект вынес.
Может быть из-за компилятора, он довольно старый, 4.9.2
0
Модератор
 Аватар для Curry
5158 / 3487 / 536
Регистрация: 01.06.2013
Сообщений: 7,567
Записей в блоге: 9
31.07.2019, 21:14
Цитата Сообщение от coder0 Посмотреть сообщение
Больше ничего нет, код в отдельный проект вынес.
а теперь уберите ошибки вроде лишней точки с запятой в строке 15, откомпилируйте и посмотрите что получится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.07.2019, 21:14
Помогаю со студенческими работами здесь

Некорректное сравнение чисел
Добрый вечер, господа! Начал мучить JS. Написал коротенький код для сравнения двух чисел. Пока числа однозначные, оно работает. ...

Некорректное сравнение округленных значений
Добрый вечер! Прошу помощи/разъяснения, пожалуйста! Ситуация следующая: В коде форме вычисляются выражения для расчета скидки....

Сравнение ячеек в диапазоне (Некорректное значение)
Здравствуйте уважаемые форумчане! Столкнулся с такой проблемой, у меня есть столбец &quot;А&quot; и &quot;Б&quot; на одном листе книги,...

Сравнение текста из файла и сравнение с текстом в программе char - Dev C++
Доброго времени суток! Имеется код программы: ifstream test(&quot;primer.txt&quot;); char awm = &quot;kod&quot;; char buff; test &gt;&gt; buff; if...

Сравнение DateTime - Почему сравнение запаздывает на 1 мин
public DateTime NextShort(DateTime cur, int ofset, int period) { var temp = (cur.Minute / period) * period + ofset;...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru