Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Типы данных


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

long,float перебрал.. неправильно считает... т.е. округляет

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

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'

всё, как бы работает, но ругается.

Автор: bel_nikita 16.3.2005, 10:12
int - целое
float - плавующее smile

Автор: Ni@m 16.3.2005, 13:20
Можешь ему явно указывать c=(int)(a/b);
Либо с = dynamic_cast<int>(a/b);
Помоему такой функции нету, можно округлить функ. ceil или floor, но они возвращают float, но можно перевести явным преобразованием типов(смотри выше)

Автор: NiJazz 16.3.2005, 13:35
Код

#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;
}

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

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



Автор: Goryachev 21.3.2005, 00:35
Функция для округления числа:
Код

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

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

Автор: DENNN 21.3.2005, 15:40
smile

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

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

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

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

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

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

floor(-1.3f);

будет возвращенно -2
если же просто отбросить числа после запятой, то получиться -1

Автор: Goryachev 26.3.2005, 13:14
DENNN
Ты прав, но все равно реализованно через кастинг int.

Автор: jorkug 27.3.2005, 04:03
А не прoще ли так:
Код

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

"%.0" - округляет значение до ближайшего целого числа.

Автор: Fire-Plug 27.3.2005, 05:18
Цитата(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(), к-рай между прочим делает округление по алгебраическим правилам.

Автор: DENNN 28.3.2005, 09:17
Цитата(jorkug @ 27.3.2005, 04:03)
А не прoще ли так:

Так не проще. Потому как если ты представишь сколько сложных операций выполняется в твоем куске кода.....- за это время
Код

(int)(value+.5)

можно около сотни раз вызвать smile

Автор: Nuzur 28.3.2005, 21:41
Тут так много было сказано, может я прусь не в свои ворота.
Но мне кажеться что человек наткнулся на то, что обрезаеться все что после зяпятой(тоесть получает 1-цу), если так то надо сделать вот что

float x = float(400)/379;
или
float x = 400.0/379;

и тогда резуль будет 1.05541

Как это верно подметил Vyacheslav.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)