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

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

Войти
Регистрация
Восстановить пароль
 
PuzanZero
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 6
#1

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

03.05.2013, 22:20. Просмотров 330. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2013, 22:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неправильная конвертация типов в MVS С++ 2008 (C++):

Не компилирует в MVS 2008 - C++
Господамы вот такая программа для проверки устного умножения в MVS 2008 ругается на time, srand и rand, в чем может быть проблема? ...

MVS 2008 открытие проекта - C++
Ребят пытаюсь открыть MVS 2008 проект .sln подписан он Version (unrecognized version), при открытие выдает: The selected file is a...

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

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

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

Конвертация типов с++ - C++
int p=255; string s=p; в результате s='я', а как внести p в s как число, чтобы s={'2','5','5'} ? только посимвольно или можно как-то...

6
kristi1
10 / 10 / 1
Регистрация: 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
1483 / 1129 / 45
Регистрация: 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
ValeryS
Модератор
6652 / 5061 / 470
Регистрация: 14.02.2011
Сообщений: 16,924
03.05.2013, 23:09 #4
для того чтобы правильно округлить при переводе в int необходимо добавить 0.5
вот так у тебя сработает без ошибок округления
C++
1
c=(int)(100*r2 - 100*r1+0.5)
1
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
03.05.2013, 23:10 #5
Кхм, а почему именно 0.5? теперь мне интересно)
0
ValeryS
Модератор
6652 / 5061 / 470
Регистрация: 14.02.2011
Сообщений: 16,924
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
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
03.05.2013, 23:22 #7
Логичка ясна, спасибо)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2013, 23:22
Привет! Вот еще темы с ответами:

Конвертация типов данных - C++
Доброго время суток. Хотел бы задать простенький вопрос. 1.Из ком. строки читаются параметры argv. Допустим один из них равен '12'...

Конвертация типов. float в string/char - C++
Помогите реализовать! Для примера возьмем: У меня есть двумерный массив типа float (Primer1) и есть массив типа string или char...

Ошибка приведения типов в MSVS 2008 - C++
for (AuraEffectList::const_iterator i......... ............. if (i==((AuraEffectList::const_iterator)NULL)) в линуксе компилируется...

Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов. - C++
Буду благодарен! Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов.


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
03.05.2013, 23:22
Ответ Создать тему
Опции темы

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