| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 - плавующее |
| Автор: 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 | ||
|
| Автор: Vyacheslav 16.3.2005, 14:21 | ||
Дело не x, а в том что компилятор трактует 400 как int. В результате имеем 1
|
| Автор: Goryachev 21.3.2005, 00:35 | ||
Функция для округления числа:
|
| Автор: pablo 21.3.2005, 14:35 |
| В мире С, есть такие функции как ceil, floor, обитают в math.h Первая округляет число в меньшую сторону, вторая в большую. Принимает аргументы как число в плавающей точкой. Не надо кастить из float в int, или наоборот. Это черевато ошибками. |
| Автор: DENNN 21.3.2005, 15:40 |
| |
| Автор: Goryachev 21.3.2005, 19:50 | ||
В данном случае, никаких ошибок быть неможет. Кастинг в int из float срезает все, что после floating point. А как ты думаешь преобразованна функция floor? |
| Автор: pablo 24.3.2005, 14:04 |
| Я думаю вот что: Если число равно 2.98 и его преобразовать в целый тип, то оно сранет 2, если юзать функции округления то они дадут разультат 3. Не надо изобретать колесо, если уже давно это сделано за вас. Добавлено @ 14:06 Но если после округления, разве что для еффективности. Но согластно Страуструпу это очен нехорошо !!! |
| Автор: DENNN 24.3.2005, 15:33 | ||||
Вообще-то функция floor() возвращет результат, который не больше переданного аргумента. Так для
будет возвращенно -2 если же просто отбросить числа после запятой, то получиться -1 |
| Автор: Goryachev 26.3.2005, 13:14 |
| DENNN Ты прав, но все равно реализованно через кастинг int. |
| Автор: jorkug 27.3.2005, 04:03 | ||
А не прoще ли так:
"%.0" - округляет значение до ближайшего целого числа. |
| Автор: Fire-Plug 27.3.2005, 05:18 | ||||
Для ответа на этот вопрос нужно сначала прибегнуть к понятиям алгебры(в частном случае, арифметики), а уж затем искать соотв. представление в языках программирования. Т.к. арифметические операции в языках программирования реализованы на основе этих самих правил. Результат деления целых чисел - есть в общем случае рациональное число, т.е. число с конечной десятичной дробью или бесконечной периодической дробью. В частном случае, результат деления целых чисел - целое число. Отсюда, требуемый тип данных для результата - это тип представляющий вещественные числа, каковых имеется: 1) float - 4 байтный тип, точность представления вещественного числа - 7 десятичных знаков 2) double - 8-байтный тип, точностью представления - 15 десятичных знаков. Отсюда вопрос: что и где у вас float округляет?
Вопрос: до какого знака после запятой требуется округлить число? Не следует путать внутреннее представление вещественного числа типами float и double с числом знаков выведенных на печать ф-цией типа printf(), к-рай между прочим делает округление по алгебраическим правилам. |
| Автор: DENNN 28.3.2005, 09:17 | ||||
Так не проще. Потому как если ты представишь сколько сложных операций выполняется в твоем куске кода.....- за это время
можно около сотни раз вызвать |
| Автор: Nuzur 28.3.2005, 21:41 |
| Тут так много было сказано, может я прусь не в свои ворота. Но мне кажеться что человек наткнулся на то, что обрезаеться все что после зяпятой(тоесть получает 1-цу), если так то надо сделать вот что float x = float(400)/379; или float x = 400.0/379; и тогда резуль будет 1.05541 Как это верно подметил Vyacheslav. |