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

Неправильная конвертация типов в MVS С++ 2008 - C++

Восстановить пароль Регистрация
 
PuzanZero
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 4
03.05.2013, 22:20     Неправильная конвертация типов в MVS С++ 2008 #1
Скажите, почему в Microsoft Visual Studio 6 результатом программы
C++
1
2
3
4
5
6
7
double r1=1.12;
double r2=1.13;
int c;
c=100*r2 - 100*r1;
cout<<"100*r1="<<100*r1<<"\n";
cout<<"100*r2="<<100*r2<<"\n";
cout<<"c="<<c;
было:
100*r1=112
100*r2=113
с=1

А при запуске этой программы в Microsoft Visual Studio 2008 результат стал таким:
100*r1=112
100*r2=113
с=0
Причём, если знак “-“ поменять на “+” то в результате будет
100*r1=112
100*r2=113
с=225

Такое вообще может быть или это глюк пиратского софта?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2013, 22:20     Неправильная конвертация типов в MVS С++ 2008
Посмотрите здесь:

C++ Ошибка приведения типов в MSVS 2008
Где скачать MVS c++ 2008 express edition? C++
Где найти файл помогания MVS C++ 2008 e-edition? C++
C++ Как создать принципиальную схему в MVS 2008 Ee?
C++ Конвертация типов с++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
03.05.2013, 22:55     Неправильная конвертация типов в MVS С++ 2008 #2
Лицензионная студия 2012 года) Тоже без понятия что за)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "iostream"
 
using namespace std;
int main ()
{
double r1=1.12;
double r2=1.13;
int c=0;
cout<<"c="<<c<<endl;
c=100*(r2 -r1);
cout<<"100*r1="<<100*r1<<"\n";
cout<<"100*r2="<<100*r2<<"\n";
cout<<"c="<<c<<endl;
system ("PAUSE");
}
Но в моем случае компилятор ругается, что возможна потеря данных при преобразовании типа!
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
03.05.2013, 22:56     Неправильная конвертация типов в MVS С++ 2008 #3
при арифметике с плавающей точкой всегда есть погрешность.
вывод эту погрешность может округлять, но при операциях она не округляется и потом при касте дабла к инту это сказывается. если точность вывода увеличить, то можно увидеть более точные значения. в дебаге тоже можно увидеть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
int main()
{
  double r1=1.12;
  double r2=1.13;
  double r1r2 = 100*r2 - 100*r1;
  int c = r1r2;
 
  cout.precision(50);
  cout<< "100*r1=" <<100*r1<<"\n";
  cout<< "100*r2=" <<100*r2<<"\n";
  cout<< "r1r2="   <<r1r2<<"\n";
  cout<< "c="      <<c;
 
  return 0;
 
}
100*r1=112.0000000000000100000000000000
100*r2=112.9999999999999900000000000000
r1r2=0.9999999999999715800000000000000
c=0
Press any key to continue . . .
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
03.05.2013, 23:09     Неправильная конвертация типов в MVS С++ 2008 #4
для того чтобы правильно округлить при переводе в int необходимо добавить 0.5
вот так у тебя сработает без ошибок округления
C++
1
c=(int)(100*r2 - 100*r1+0.5)
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
03.05.2013, 23:10     Неправильная конвертация типов в MVS С++ 2008 #5
Кхм, а почему именно 0.5? теперь мне интересно)
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
03.05.2013, 23:21     Неправильная конвертация типов в MVS С++ 2008 #6
Цитата Сообщение от kristi1 Посмотреть сообщение
Кхм, а почему именно 0.5? теперь мне интересно)
по правилам математики ну и компьютера
при переводе в целочисленное дробная часть отбрасывается хоть там будет 0.9999999999
по правилам математики число меньшее чем х.5 округляется в меньшую сторону иначе в большую
пробуем
2.5+0.5=3.0 =3
2.9+0.5=3.4=3
2.1+0.5=2.6=2
2.4+0.5=2.9=2

Добавлено через 4 минуты
на этом основано округление например тебе нужно округлить до 2 знака
умножаем на 100 добавляем 0.5 приводим к int и делим на 100
до третьего знака 1000 ну и так далее
например
C++
1
2
3
double a=3.1415926;
int m=a*100+0.5;
a=m/100; // a=3.14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2013, 23:22     Неправильная конвертация типов в MVS С++ 2008
Еще ссылки по теме:

MVS 2008 открытие проекта C++
Конвертация типов данных C++
C++ Не компилирует в MVS 2008

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

Или воспользуйтесь поиском по форуму:
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
03.05.2013, 23:22     Неправильная конвертация типов в MVS С++ 2008 #7
Логичка ясна, спасибо)
Yandex
Объявления
03.05.2013, 23:22     Неправильная конвертация типов в MVS С++ 2008
Ответ Создать тему
Опции темы

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