Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразования типов, Не понятка с преобразованием 
:(
    Опции темы
NoNo
Дата 16.11.2006, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 14.11.2006

Репутация: нет
Всего: нет



Почему следующий код программы вычисляет не правильно:
.....
int a;
double b;
cin >> b;
a = b * 100;
cout << a;
....
Варианты ответов:
Ввод: 0,13
Вывод: 13

Ввод: 0,12
Вывод: 11

........
Я как понимаю в плане преобразования с начало правая часть от знака присваевания "b * 100" вычесляется, причем создаётся временная переменная типа double которая содержит результат вычисления, потом значение временной переменной присваевается целочисленной переменной "a", а дробная часть значения отбрасывается......но как видно после компиляции результат выполнения не всегда выдаёт правельный ответ.....например если переменной "b" присваивать значения: 0.12, 0.15, 0.21 и т.д. - то результат не верен........
а если присвоить: 0.13, 0.14 или 0.19 - то результат работы правелен.
___________________________________________________________________________________

Конечно можно и написать программу и так:
...........
int a;
double b;
cin >> b;
b *= 100;
a = b;
cout << a;
............
тогда программа работает правильно при любом значении "b"

Но у меня вопрос...... Почему первый вариант неверен, ведь логически он идентичен второму?
PM MAIL   Вверх
Vyacheslav
Дата 16.11.2006, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Все дело в двоичной форме хранения double. Эта форма для чисел с плавающей  запятой (в отличие от целых чисел) позволяет хранить число с определенной прогрешностью в ту или иную сторону. И скорее всего, вместо   числа  0.12 имеем что-то тип 0.11999999999999998 smile. В результате Вы и имеете 11. Это не особенность Builder, это особенность , которая должна учитываться при выполненни численных методов. Если Вы  знакомы  с Высшей математикой, то вспомните, что там два числа с плавающей запятой считаются равными, если разность между ними меньше заданной прогрешности | b - 0.12 | < e.  


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
NoNo
Дата 16.11.2006, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 14.11.2006

Репутация: нет
Всего: нет



Но ведь вариант программы:
.....
int a;
double b;
cin >> b;
b *= 100;
a = b;
cout << a;
.......
работает правильно.......

в чём разница между ними....ведь и в первом и во втором варианте целочисленной переменной присваевается значения типа double......
неужели тип переменной играет роль т.е. в первом варианте сначало создается временная переменная в которую записывается  результат вычисления, а потом уже идёт присваивание зарезервированной целочисленной переменной значение хранящееся в временной переменной вещественного типа..... А во втором варианте(в правильном варианте программы) зарезарвированная целочисленной переменной присваевается значения с переменной такого же типа double только переменная уже не временная а зарезервированная......

а то что это не особенность конкретно Builder это я только что понял...откомпелиров исходный код программы на других компиляторах
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0942 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.