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

Неявное преобразование переменных - C++

Восстановить пароль Регистрация
 
zabuka
 Аватар для zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
24.01.2011, 18:33     Неявное преобразование переменных #1
Добрый вечер!
Хочу попросить помощи в разъяснении следующей ситуации:
есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
 
using namespace std;
 
int main()
{
    int userCh;
    float tempCel, tempFahr;
    cout << "If you want convert temperature in Celsius to temperature in Fahrenheit push 1,\n";
    cout << "if you want convert temperature in Fahrenheit to temperature in Celsius push 2: ";
    cin >> userCh;
    switch(userCh)
    {
        case 1:
            cout << "Insert temperature in Celsius: ";
            cin >> tempCel;
            tempFahr = 9.0 /5.0 *tempCel +32.0;
            cout << "Temperature in Fahrenheit is: " << tempFahr << endl;
            break;
       case 2:
            cout << "Insert temperature in Fahrenheit: ";
            cin >> tempFahr;
            tempCel = (tempFahr -32.0) *5.0 /9.0;
            cout << "Temperature in Celsius is: " << tempCel << endl;
        break;
        default:
        {
            cout << "You inserted wrong symbol!" << endl;
        }
    }
    return 0;
}
Если все константы сделать целыми, то ветвление case 1:, будет работать не верно, будет отбрасывать, в формуле, 9/5*.
Подскажите, пожалуйста чем это связано, чтобы уложить у себя в голове и больше не сталкиваться с этой ошибкой.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
24.01.2011, 18:40     Неявное преобразование переменных #2
поясните что именно не работает, перевод из одной систему в другую правильный
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.01.2011, 18:49     Неявное преобразование переменных #3
Цитата Сообщение от zabuka Посмотреть сообщение
C++
1
tempFahr = 9 /5 *tempCel +32;
? Это
C++
1
tempFahr = 1 *tempCel +32;
, то есть
C++
1
tempFahr = tempCel +32;
. Кроме переполнения типа ничем не грозит, но и это вылетать не должно. У флоата диапазон не только больше, но у границ диапазона
C++
1
tempFahr = tempCel +32
; даёт
C++
1
tempFahr == tempCel
.
zabuka
 Аватар для zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
24.01.2011, 19:02  [ТС]     Неявное преобразование переменных #4
Цитата Сообщение от panicwassano Посмотреть сообщение
поясните что именно не работает, перевод из одной систему в другую правильный
Например пользователь выбирает перевод Цельсия в Фаренгейты. То есть работает:
C++
1
2
3
4
5
6
case 1:
            cout << "Insert temperature in Celsius: ";
            cin >> tempCel;
            tempFahr = 9.0 /5.0 *tempCel +32.0;
            cout << "Temperature in Fahrenheit is: " << tempFahr << endl;
            break;
если формулу переписать как: tempFahr = 9 /5 *tempCel +32;
оставив тип переменной как float, то 9/5 *, не будет участвовать в расчете tempFahr. И когда пользователь введет 100, он получит результат 132, а не 212.
Я не понимаю почему так происходит.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.01.2011, 19:06     Неявное преобразование переменных #5
Потому что
C++
1
9/5
- это
C++
1
(int)(9/5)
. То есть, какой тип делимого, таков и частного, а округление всегда вниз.
Yandex
Объявления
24.01.2011, 19:06     Неявное преобразование переменных
Ответ Создать тему
Опции темы

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