![]() |
|
|
![]()
|
|
| NoNo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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" Но у меня вопрос...... Почему первый вариант неверен, ведь логически он идентичен второму? |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Все дело в двоичной форме хранения double. Эта форма для чисел с плавающей запятой (в отличие от целых чисел) позволяет хранить число с определенной прогрешностью в ту или иную сторону. И скорее всего, вместо числа 0.12 имеем что-то тип 0.11999999999999998
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| NoNo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 14.11.2006 Репутация: нет Всего: нет |
Но ведь вариант программы:
..... int a; double b; cin >> b; b *= 100; a = b; cout << a; ....... работает правильно....... в чём разница между ними....ведь и в первом и во втором варианте целочисленной переменной присваевается значения типа double...... неужели тип переменной играет роль т.е. в первом варианте сначало создается временная переменная в которую записывается результат вычисления, а потом уже идёт присваивание зарезервированной целочисленной переменной значение хранящееся в временной переменной вещественного типа..... А во втором варианте(в правильном варианте программы) зарезарвированная целочисленной переменной присваевается значения с переменной такого же типа double только переменная уже не временная а зарезервированная...... а то что это не особенность конкретно Builder это я только что понял...откомпелиров исходный код программы на других компиляторах |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |