The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"присвоение int величины double переменной"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"присвоение int величины double переменной"  
Сообщение от Василий (??) on 07-Ноя-08, 08:55 
Друзья,

изучаю С. Вот такой простой код:

#include <stdlib.h>

double u1;
u1 = rand() / RAND_MAX;

По стандарту rand() возвращает int, почему же результат операции (rand() / RAND_MAX) не преобразовывается к double и нужно делать это принудительно:

u1 = (double)rand() / RAND_MAX;

Спасибо!
PS. еще много непонятного в С, поэтому такие глупые вопросы.

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "присвоение int величины double переменной"  
Сообщение от phpcoder email(??) on 07-Ноя-08, 09:00 
>По стандарту rand() возвращает int, почему же результат операции (rand() / RAND_MAX)
>не преобразовывается к double и нужно делать это принудительно:

Потому что оба операнда являются целыми числами. Чтобы получить дробное, необходимо, чтобы хотя бы один операнд был вещественным.

P.S. У Кернигана и Ритчи это вроде бы есть. Ищите в окрестностях программки для перевода градусов цельсия в фаренгейты.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "присвоение int величины double переменной"  
Сообщение от Василий (??) on 07-Ноя-08, 10:57 
>Потому что оба операнда являются целыми числами. Чтобы получить дробное, необходимо, чтобы
>хотя бы один операнд был вещественным.

Гм.. но ведь результат мы присваиваем переменной, объявленной как double. По идее правый операнд приводится к типу левого?

>P.S. У Кернигана и Ритчи это вроде бы есть. Ищите в окрестностях
>программки для перевода градусов цельсия в фаренгейты.

обязательно поищу.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "присвоение int величины double переменной"  
Сообщение от phpcoder email(??) on 07-Ноя-08, 12:07 
>>Потому что оба операнда являются целыми числами. Чтобы получить дробное, необходимо, чтобы
>>хотя бы один операнд был вещественным.
>
>Гм.. но ведь результат мы присваиваем переменной, объявленной как double. По идее
>правый операнд приводится к типу левого?

Ну да, приводится (в данном случае он "расширится" до double). Только это уже результат будет приводится. А результат-то имеет тип int..

P.S. Но лучше не слушайте меня, а почитайте книжку или даже стандарт!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "присвоение int величины double переменной"  
Сообщение от mikra on 07-Ноя-08, 13:35 
>>Потому что оба операнда являются целыми числами. Чтобы получить дробное, необходимо, чтобы
>>хотя бы один операнд был вещественным.
>
>Гм.. но ведь результат мы присваиваем переменной, объявленной как double. По идее
>правый операнд приводится к типу левого?
>
>>P.S. У Кернигана и Ритчи это вроде бы есть. Ищите в окрестностях
>>программки для перевода градусов цельсия в фаренгейты.
>
>обязательно поищу.

А еще все наверное проходили
double res = 5/2
где res оказывается развным 2, а не 2.5
Так начинающие программисты узнают о приведении типов :)))

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "присвоение int величины double переменной"  
Сообщение от Василий (??) on 10-Ноя-08, 03:58 
>>>Потому что оба операнда являются целыми числами. Чтобы получить дробное, необходимо, чтобы
>>>хотя бы один операнд был вещественным.
>>
>>Гм.. но ведь результат мы присваиваем переменной, объявленной как double. По идее
>>правый операнд приводится к типу левого?
>А еще все наверное проходили
>double res = 5/2
>где res оказывается развным 2, а не 2.5
>Так начинающие программисты узнают о приведении типов :)))

с этим уже сталкивался. Но в K&R конкретно не описано, почему так получается, т.е. где в стандарте точно описано поведение и объяснение такого поведения?

Например, везде пишут, что преобразования операндов происходят естественным образом. Выходит и здесь:

double res = 5/2

это должно быть естественно, т.е. результат деления 5 на 2 присваивается переменной с плавающей точкой.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "присвоение int величины double переменной"  
Сообщение от angra (ok) on 10-Ноя-08, 05:21 
Мда, тяжелее всего объяснять очевидные вещи. Попробуем еще раз. Напомним некоторые факты
1. У опрераций есть приоритеты
2. Все операции выполняются по очереди, с учетом результатов предыдущих, но без учета следующих.
3. Присваивание это тоже операция
Итого получаем:
1. Деление имеет более высокий приоритет чем присваивание, значит выполняется первым
2. "5" это целое число, "2" это целое число, значит будет выполнятся целочисленное деление и результатом его будет "2".
3. Выполняется операция присваивания. "2" целое, а вот res с плавающей точкой, производится преобразование и в res попадет "2.0"
Что остается непонятным?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "присвоение int величины double переменной"  
Сообщение от Василий (??) on 10-Ноя-08, 06:22 
>3. Выполняется операция присваивания. "2" целое, а вот res с плавающей точкой,
>производится преобразование и в res попадет "2.0"
>Что остается непонятным?

неправда, в res как раз попадает 2, проверялось на gcc-4.1.2 Если хотя бы один операнд содержал плавающую точку или применялось бы явное (explicit) преообразование (type casting), тогда и результат преобразовался бы к double.

В этом и была суть вопроса, если бы вы внимательно прочитали.

PS. не стоит так раздражаться на вопросы новичков, все проходят свои "первые шаги в С".

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "присвоение int величины double переменной"  
Сообщение от angra (ok) on 11-Ноя-08, 06:18 
Так у вас еще и с математикой проблемы? Расскажу секрет: 2.0 равно 2 с точки зрения математики. Переменная res у вас имеет тип с плавающей точкой, а значит в ней ВСЕГДА присутствует мантисса и порядок, оно на аппаратном уровне так хранится, а вот выводить на терминал вы ее можете в каком угодно виде.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "присвоение int величины double переменной"  
Сообщение от jd2 (??) on 12-Ноя-08, 17:42 
Вы, разумеется, абсолютно правы... с точки зрения математики. Но зачем же так высокомерно говорить? Ведь форум - это не место, где подскажут, кто какой идиот и насколько кому до кого далеко. А место, где люди собрались, чтобы помочь друг другу. И типа того...

P.S. Ну и для того, конечно, чтобы обстебать двоечников-студентов, дабы навсегда отвадить их от написания программ, чтобы они, не приведи господь, не написали какой-нибудь кривой программы управления ядерным реактором, не говоря уже о коллайдерах.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "присвоение int величины double переменной"  
Сообщение от Alexander S. Salieff email on 13-Дек-08, 05:06 
Чего развыступались? Независимо от вступления человек разжевал пошагово процесс, так нет, и этому не рады, а как еще разъяснить, телепатией, чтоли?

>Вы, разумеется, абсолютно правы... с точки зрения математики. Но зачем же так
>высокомерно говорить? Ведь форум - это не место, где подскажут, кто
>какой идиот и насколько кому до кого далеко. А место, где
>люди собрались, чтобы помочь друг другу. И типа того...
>
>P.S. Ну и для того, конечно, чтобы обстебать двоечников-студентов, дабы навсегда отвадить
>их от написания программ, чтобы они, не приведи господь, не написали
>какой-нибудь кривой программы управления ядерным реактором, не говоря уже о коллайдерах.
>

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру