Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 16
1

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

03.05.2013, 22:20. Просмотров 458. Ответов 6
Метки нет (Все метки)

Скажите, почему в 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

Такое вообще может быть или это глюк пиратского софта?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2013, 22:20
Ответы с готовыми решениями:

Не компилирует в MVS 2008
Господамы вот такая программа для проверки устного умножения в MVS 2008 ругается на time, srand и...

Настройки в MVS 2008
1.Если не затруднит, скажите как убрать полный путь к ошибке в настройках. Если я выразился не...

MVS 2008 открытие проекта
Ребят пытаюсь открыть MVS 2008 проект .sln подписан он Version (unrecognized version), при открытие...

Нужен пример использование CheckBox в MVS 2008
Покажите пожалуйста пример использование checkbox в MVS 2008. Ситуация следующая: при выборе...

6
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
03.05.2013, 22:55 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");
}
Но в моем случае компилятор ругается, что возможна потеря данных при преобразовании типа!
0
DU
1492 / 1138 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
03.05.2013, 22:56 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 . . .
1
Модератор
Эксперт по электронике
8229 / 6096 / 814
Регистрация: 14.02.2011
Сообщений: 21,168
03.05.2013, 23:09 4
для того чтобы правильно округлить при переводе в int необходимо добавить 0.5
вот так у тебя сработает без ошибок округления
C++
1
c=(int)(100*r2 - 100*r1+0.5)
1
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
03.05.2013, 23:10 5
Кхм, а почему именно 0.5? теперь мне интересно)
0
Модератор
Эксперт по электронике
8229 / 6096 / 814
Регистрация: 14.02.2011
Сообщений: 21,168
03.05.2013, 23:21 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
1
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
03.05.2013, 23:22 7
Логичка ясна, спасибо)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2013, 23:22

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как создать принципиальную схему в MVS 2008 Ee?
Иногда встречаю в книгах схемы работы программы в виде разного рода квадратиков, ромбов,...

Где скачать MVS c++ 2008 express edition?
Помогите, пожалуйста, скачать microsoft visual studio c++ 2008 express edition, только не с сайта...

Как подключить libpcap к проекту MVS 2008
Всем привет. Дали задание написать сниффер используя библиотеку libpcap. Саму библу я скачал версия...

Где найти файл помогания MVS C++ 2008 e-edition?
Подскажите, пожалуйста, где можно скачать файл помощи MVS C++ 2008 Express edition? А то у меня...


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

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

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