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

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

Восстановить пароль Регистрация
 
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 31
09.12.2013, 15:16     Непонятный результат при математических операциях #1
Помогите пожалуйста. Столкнулся с непонятной фигней и непойму ее причину...
Простая программа, выделяющая дробную часть, но результат неожиданный...
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++ - результат одинаков
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ryuk
 Аватар для Ryuk
179 / 177 / 33
Регистрация: 10.06.2011
Сообщений: 869
09.12.2013, 15:23     Непонятный результат при математических операциях #2
Bino321, целая часть вещественного числа
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 31
09.12.2013, 16:40  [ТС]     Непонятный результат при математических операциях #3
Спасибо. Помогло. Но причины через раз корректной работы моего кода так и не понял( Кто может объяснить?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
09.12.2013, 16:50     Непонятный результат при математических операциях #4
Кури дискретную математику и представление вещественных чисел в компьютере.

Я не проверял, но, скорее всего, твое а=12345.32 на самом деле представляется в компьютере как 12345.319999999... - тогда, разумеется, по твоему коду получится c=31. Ну и в остальных случаях из "через раз" - аналогично.
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 31
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. Логики не вижу(((
Так что проблема все еще актуальна. Рано обрадовался, еще не работает(
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
09.12.2013, 17:44     Непонятный результат при математических операциях #6
Ну вот специально посмотрел в отладчике.
a=12345.72 на самом деле 12345.719999999999
a=12345.35 на самом деле 12345.35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2013, 17:56     Непонятный результат при математических операциях
Еще ссылки по теме:

Непонятный глюк при дебаге C++
Код выдает непонятный результат -1.#IND C++
C++ Неявные приведения в операциях

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

Или воспользуйтесь поиском по форуму:
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 31
09.12.2013, 17:56  [ТС]     Непонятный результат при математических операциях #7
Спасибо. Непонятная логика какая-то в представлении вещественных чисел в компьютере... Значит буду выкручиватся из положения)
Yandex
Объявления
09.12.2013, 17:56     Непонятный результат при математических операциях
Ответ Создать тему
Опции темы

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