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

Квадратный корень из из типа int - C++

Восстановить пароль Регистрация
 
viifelso
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 51
20.02.2014, 23:42     Квадратный корень из из типа int #1
учусь программировать на с++ по Бьерну. Загнала в тупик простенькая задачка.
Почему с++ считает квадратный корень из из типа int (причём правильно, хотя Бьерн говорит корень не может быть вычислен из int) и если оно приводит автоматом к вещественному типу число n, тогда почему оно не приводит к вещественому типу n /2 (к примеру 11/2 пишет равно 5)?

Прошу у вас помощи!



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <std_lib_facilities.h>
#include <conio.h>
//простая программа, показывающая работу операторов
 
int main ()
{
    setlocale (LC_ALL,"Russian");
    cout << "Please , set integer value: ";
    int n;
    cin >> n;
    cout << "\n n ==\t" << n
         << "\n n+1 == \t" << n+1
         << "\n три раза по n == \t" << 3*n
         << "\n два раза по n == \t" << n+n
         << "\n n в квадрате == \t" << n*n
         << "\n половина n == \t" << n/2
         << "\n корень квадратный из n == \t" << sqrt(n)
         << endl; 
        _getch ();
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
20.02.2014, 23:54     Квадратный корень из из типа int #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от viifelso Посмотреть сообщение
Бьерн говорит корень не может быть вычислен из int
имеется ввиду, что точно вычислить квадратный корень невозможно, из-за ограниченности возможностей памяти, потому корень будет округлен в каком-то знаке.
Цитата Сообщение от viifelso Посмотреть сообщение
автоматом к вещественному типу число n, тогда почему оно не приводит к вещественому типу n /2
приводит корень к вещественному, потому что не логично приводить его к целому, потому функцию перегрузили именно так. а вот деление целого на целое - это вопрос договоренности и удобства.
viifelso
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 51
20.02.2014, 23:56  [ТС]     Квадратный корень из из типа int #3
спасибо
DrOffset
6459 / 3833 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
21.02.2014, 00:09     Квадратный корень из из типа int #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Функция sqrt принимает только вещественные числа, поэтому происходит преобразование (преобразование int -> double, один из видов автоматического преобразования разрешенных в С++).
В случае с делением n/2 - тут оба аргумента целочисленные, поэтому и результат целочисленный. Если сделать, например, n/2.0, то можно убедиться, что результат будет другой.

Добавлено через 9 минут
Цитата Сообщение от metaluga145 Посмотреть сообщение
а вот деление целого на целое - это вопрос договоренности и удобства.
Вопрос, который четко описан в стандарте:
5/10
Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield
result types in a similar way. The purpose is to yield a common type, which is also the type of the result.
This pattern is called the usual arithmetic conversions, which are defined as follows:
— If either operand is of scoped enumeration type (7.2), no conversions are performed; if the other
operand does not have the same type, the expression is ill-formed.
— If either operand is of type long double, the other shall be converted to long double.
— Otherwise, if either operand is double, the other shall be converted to double.
— Otherwise, if either operand is float, the other shall be converted to float.

— Otherwise, the integral promotions (4.5) shall be performed on both operands59.
Then the following rules shall be applied to the promoted operands:
— If both operands have the same type, no further conversion is needed.
— Otherwise, if both operands have signed integer types or both have unsigned integer types, the
operand with the type of lesser integer conversion rank shall be converted to the type of the
operand with greater rank.
— Otherwise, if the operand that has unsigned integer type has rank greater than or equal to the
rank of the type of the other operand, the operand with signed integer type shall be converted to
the type of the operand with unsigned integer type.
— Otherwise, if the type of the operand with signed integer type can represent all of the values of
the type of the operand with unsigned integer type, the operand with unsigned integer type shall
be converted to the type of the operand with signed integer type.
— Otherwise, both operands shall be converted to the unsigned integer type corresponding to the
type of the operand with signed integer type.
Как видно из написанного, если операнды одного типа, то никакого преобразования не происходит.
И если один из операндов вещественного типа - преобразование происходит к нему.
Yandex
Объявления
21.02.2014, 00:09     Квадратный корень из из типа int
Ответ Создать тему
Опции темы

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