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

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

Войти
Регистрация
Восстановить пароль
 
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 33
#1

Непонятный результат при математических операциях - C++

09.12.2013, 15:16. Просмотров 237. Ответов 6
Метки нет (Все метки)

Помогите пожалуйста. Столкнулся с непонятной фигней и непойму ее причину...
Простая программа, выделяющая дробную часть, но результат неожиданный...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    double a=12345.20;
    int b,c;
    b=a;
    c=(a-b)*100;
    cout<<c<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
Если а=12345.20 то с=20 (это правильно). Но если написать а=12345.32 то с=31. И такое не только при значении а=12345.32... много значений дробной части при которой получается непонятный результат (на 1 меньше нужного) почему так?
Думал что это из-за неявных преобразований, но почему именно такой результат и только при некоторых значениях дробной части - непойму.
Тестировал на visual c++ 2010 и на dev-c++ - результат одинаков
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2013, 15:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Непонятный результат при математических операциях (C++):

Непонятный результат выполнения программы - C++
Есть такой код: при выполнении выдает непонятный результат(Вложение 1),условия(вложение 2). Может кто то подскажет почему #include...

Код выдает непонятный результат -1.#IND - C++
#include&lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;iostream&gt; int main() { int a=-2,b=6; double x=-2,y=0,c=0.5; do { ...

Перевод из Цельсия в Фаренгейты, непонятный результат работы кода - C++
int _tmain(int argc, _TCHAR* argv) { float summa; cout &lt;&lt; &quot;Введите температуру в градусах цельсия: &quot;; cin &gt;&gt; summa; cout &lt;&lt;...

Написать программу, демонстрирующую потери точности при арифметических операциях - C++
Можете рассписать по пунктам, что делать? Суть задания я уловила, а как реализовать - без единого понятия! Потеря точности при сложении:...

Непонятный глюк при дебаге - C++
Курсор стоял на 200-й строке, я добавил Buffer в Watch и сразу вылезло окно call stack.

Непонятный вызов Деструкторов при создании списка - C++
Непонятный вызов Деструкторов при создании списка. #include &lt;iostream&gt; #include &lt;list&gt; #include &lt;vector&gt; #include &lt;string&gt; ...

6
Ryuk
179 / 177 / 33
Регистрация: 10.06.2011
Сообщений: 871
09.12.2013, 15:23 #2
Bino321, целая часть вещественного числа
1
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 33
09.12.2013, 16:40  [ТС] #3
Спасибо. Помогло. Но причины через раз корректной работы моего кода так и не понял( Кто может объяснить?
0
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
09.12.2013, 16:50 #4
Кури дискретную математику и представление вещественных чисел в компьютере.

Я не проверял, но, скорее всего, твое а=12345.32 на самом деле представляется в компьютере как 12345.319999999... - тогда, разумеется, по твоему коду получится c=31. Ну и в остальных случаях из "через раз" - аналогично.
0
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 33
09.12.2013, 17:04  [ТС] #5
Цитата Сообщение от CheshireCat Посмотреть сообщение
Кури дискретную математику и представление вещественных чисел в компьютере.

Я не проверял, но, скорее всего, твое а=12345.32 на самом деле представляется в компьютере как 12345.319999999... - тогда, разумеется, по твоему коду получится c=31. Ну и в остальных случаях из "через раз" - аналогично.
А почему тогда 12345.35 представляется как 12345.35, а не 12345.3499999...?

Выяснил что проблема проявляется при конвертировании типов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;
 
int main(int argc, char *argv[])
{
    double a=12345.72;
    double b,c;
    c=modf(a,&b);
    cout<<c*100<<endl;
    int q;
    q=static_cast<int>(c*100);
    cout<<q<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
Результат работы программы: до конвертирования cout<<c*100<<endl выдает 72. А после конвертирования cout<<q<<endl выдает 71.
Если задать а=12345.78 то и до конвертирования и после результат 78. Логики не вижу(((
Так что проблема все еще актуальна. Рано обрадовался, еще не работает(
0
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
09.12.2013, 17:44 #6
Ну вот специально посмотрел в отладчике.
a=12345.72 на самом деле 12345.719999999999
a=12345.35 на самом деле 12345.35
1
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 33
09.12.2013, 17:56  [ТС] #7
Спасибо. Непонятная логика какая-то в представлении вещественных чисел в компьютере... Значит буду выкручиватся из положения)
0
09.12.2013, 17:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2013, 17:56
Привет! Вот еще темы с ответами:

Неявные приведения в операциях - C++
В умной книжке написано, что в арифметических выражениях все операнды приводятся к одному типу, если это возможно, пример: int a = 5;...

а куб в четырех операциях - C++
pow(a,3.0) и pow (a,10) за четыре операции ; pow(a,4.0) pow(a,20.0) за пять операции как написать без пова ? Добавлено через 12 минут ...

Написать программу проверки синтаксиса в логических операциях - C++
На с++ нужно написать программу проверки синтаксиса в логических операциях,очень срочно

При делении 2 на 4 результат - 0 - C++
Стыдно, но не могу понять, почему компилятор выдает 0. Есть код функции:int high = 0; int mid = 0; int h; int m; int in; ...


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

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

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