Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Типы данных, какой тип данных правильньнее ? 
:(
    Опции темы
admsasha
Дата 16.3.2005, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мне просто надо разделить два числа
x=400/379
какой тип данных нужен для X ?

long,float перебрал.. неправильно считает... т.е. округляет
PM MAIL WWW ICQ Jabber   Вверх
admsasha
Дата 16.3.2005, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Уточняю что мне надо,
есть два числа, их нужно поделить, и вывести результат, потом округлить это число, и снова вывести результат.

float a;
float b;
int c;
int d;
c=a/b - правильно считает
prinft("%? ",c) % что писать нужно ?, "%f" ?

d=c - так правильно будет ??, какая функция для округления числа, и помешения ее в int ?

при компиляции ругается:
proba.c:18: warning: assignment to `long int' from `float'

всё, как бы работает, но ругается.
PM MAIL WWW ICQ Jabber   Вверх
bel_nikita
Дата 16.3.2005, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



int - целое
float - плавующее smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Ni@m
Дата 16.3.2005, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 11.3.2004
Где: почти Киев

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



Можешь ему явно указывать c=(int)(a/b);
Либо с = dynamic_cast<int>(a/b);
Помоему такой функции нету, можно округлить функ. ceil или floor, но они возвращают float, но можно перевести явным преобразованием типов(смотри выше)
--------------------
Обучение - как переливание воды из одной чашки в другую: всегда лучше, чтоб чашка со знаниями нахордилась выше.
PM MAIL WWW ICQ   Вверх
NiJazz
Дата 16.3.2005, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



Код

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    div_t        dt;

    dt = div(400, 379);

    printf("Celaya 4ast: %d\n", dt.quot);
    printf("Ostatok: %d\n", dt.rem);

    return 0;
}

PM MAIL   Вверх
Vyacheslav
Дата 16.3.2005, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Дело не x, а в том что компилятор трактует 400 как int. В результате имеем 1 smile
Код

//нужно так 400. 
double x=400./379;
//bkb так
double x = double(400)/379;





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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.2.2005
Где: Израиль

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



Функция для округления числа:
Код

int round(double num)
{
    return (int)(num+0.5);
}

PM MAIL   Вверх
pablo
Дата 21.3.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

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



В мире С, есть такие функции как ceil, floor, обитают в math.h
Первая округляет число в меньшую сторону, вторая в большую.
Принимает аргументы как число в плавающей точкой.
Не надо кастить из float в int, или наоборот. Это черевато ошибками.



--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
DENNN
Дата 21.3.2005, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



smile
PM ICQ   Вверх
Goryachev
Дата 21.3.2005, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.2.2005
Где: Израиль

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



Цитата(pablo @ 21.3.2005, 14:35)
Не надо кастить из float в int, или наоборот. Это черевато ошибками.

В данном случае, никаких ошибок быть неможет. Кастинг в int из float срезает все, что после floating point. А как ты думаешь преобразованна функция floor?

Это сообщение отредактировал(а) Goryachev - 21.3.2005, 19:52
PM MAIL   Вверх
pablo
Дата 24.3.2005, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

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



Я думаю вот что:
Если число равно 2.98 и его преобразовать в целый тип, то оно сранет 2, если юзать функции округления то они дадут разультат 3.
Не надо изобретать колесо, если уже давно это сделано за вас.

Добавлено @ 14:06
Но если после округления, разве что для еффективности.
Но согластно Страуструпу это очен нехорошо !!!


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
DENNN
Дата 24.3.2005, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



Цитата(Goryachev @ 21.3.2005, 19:50)
Кастинг в int из float срезает все, что после floating point. А как ты думаешь преобразованна функция floor

Вообще-то функция floor() возвращет результат, который не больше переданного аргумента.
Так для
Код

floor(-1.3f);

будет возвращенно -2
если же просто отбросить числа после запятой, то получиться -1
PM ICQ   Вверх
Goryachev
Дата 26.3.2005, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.2.2005
Где: Израиль

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



DENNN
Ты прав, но все равно реализованно через кастинг int.
PM MAIL   Вверх
jorkug
Дата 27.3.2005, 04:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А не прoще ли так:
Код

void Function(int a, int b)
{
   double c = (double)a/b;
   printf("%f\n", c);
   printf("%.0f", c);
}

"%.0" - округляет значение до ближайшего целого числа.
PM MAIL   Вверх
Fire-Plug
Дата 27.3.2005, 05:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: -1
Всего: 0



Цитата(admsasha @ 16.3.2005, 09:16)
мне просто надо разделить два числа
x=400/379
какой тип данных нужен для X ?

Для ответа на этот вопрос нужно сначала прибегнуть к понятиям алгебры(в частном случае, арифметики), а уж затем искать соотв. представление в языках программирования. Т.к. арифметические операции в языках программирования реализованы на основе этих самих правил.
Результат деления целых чисел - есть в общем случае рациональное число, т.е. число с конечной десятичной дробью или бесконечной периодической дробью. В частном случае, результат деления целых чисел - целое число.
Отсюда, требуемый тип данных для результата - это тип представляющий вещественные числа, каковых имеется:
1) float - 4 байтный тип, точность представления вещественного числа - 7 десятичных знаков
2) double - 8-байтный тип, точностью представления - 15 десятичных знаков.

Отсюда вопрос: что и где у вас float округляет?

Цитата(admsasha @ 16.3.2005, 10:02)
два числа, их нужно поделить, и вывести результат, потом округлить это число,

Вопрос: до какого знака после запятой требуется округлить число?
Не следует путать внутреннее представление вещественного числа типами float и double с числом знаков выведенных на печать ф-цией типа printf(), к-рай между прочим делает округление по алгебраическим правилам.
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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