The OpenNET Project / Index page

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

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

"округление"
Сообщение от Alexander emailИскать по авторуВ закладки on 03-Апр-03, 14:09  (MSK)
Подскажите, пожалуйста, как округлить float в int.
в проге типа:

int rounded;
float source;
source=5.6;
rounded=round(source);

rounded определяется как 131072. То же самое и с функциями lrint,lround.
В чем проблема?
Спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "округление"
Сообщение от SergeiZz Искать по авторуВ закладки on 03-Апр-03, 15:50  (MSK)
>Подскажите, пожалуйста, как округлить float в int.
>в проге типа:
>
>int rounded;
>float source;
> source=5.6;
> rounded=round(source);
>
>rounded определяется как 131072. То же самое и с функциями lrint,lround.
>В чем проблема?
>Спасибо.
Я взял эти строки и скомпилировал с помощью g++, поправив только
rounded= int( round(source) );
При 5.6 результат 6. При 5.5 результат 5.

round() требует double. Может прикалывается неявное приведение типов?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "округление"
Сообщение от Alexander emailИскать по авторуВ закладки on 03-Апр-03, 16:00  (MSK)
>Я взял эти строки и скомпилировал с помощью g++, поправив только
>rounded= int( round(source) );
>При 5.6 результат 6. При 5.5 результат 5.
>
>round() требует double. Может прикалывается неявное приведение типов?

У меня прога на С, так что g++ не катит, если обьявлять source как double, результат не меняется :(((.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "округление"
Сообщение от SergeiZz Искать по авторуВ закладки on 03-Апр-03, 16:38  (MSK)
>>Я взял эти строки и скомпилировал с помощью g++, поправив только
>>rounded= int( round(source) );
>>При 5.6 результат 6. При 5.5 результат 5.
>>
>>round() требует double. Может прикалывается неявное приведение типов?
>
>У меня прога на С, так что g++ не катит, если обьявлять
>source как double, результат не меняется :(((.
g++ катит и C программы...

Если по теме, то я скомпилировал теперь так:
gcc -Wall -lm -o round round.c
выводя на терминал так:
printf("source = %f rounded = %d \n", source, rounded);
При 5.5 теперь пишет 6, при 5.2 пишет 5, при 5.6 пишет 6.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "округление"
Сообщение от Alexander emailИскать по авторуВ закладки on 04-Апр-03, 18:11  (MSK)
>g++ катит и C программы...
>
>Если по теме, то я скомпилировал теперь так:
>gcc -Wall -lm -o round round.c
>выводя на терминал так:
>printf("source = %f rounded = %d \n", source, rounded);
>При 5.5 теперь пишет 6, при 5.2 пишет 5, при 5.6 пишет
>6.

Все хорошо, но вот Ваш код даже с gcc -Wall -lm -o round round.c компилится не хочет (под gcc 2.96 Linux(RH7.2) ), а выдает:
parse error before `int' в строке rounded = int ( round ( source ) );
Может что подскажите?
Исходный текст:
int rounded;
double source;
source = 5.6;
rounded = int ( round ( source ) );
printf("%d\n",rounded);

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "округление"
Сообщение от Max Zinal emailИскать по авторуВ закладки on 05-Апр-03, 11:09  (MSK)
>Все хорошо, но вот Ваш код даже с gcc -Wall -lm -o
>round round.c компилится не хочет (под gcc 2.96 Linux(RH7.2) ), а
>выдает:
>parse error before `int' в строке rounded = int ( round (
>source ) );
>Может что подскажите?
>Исходный текст:
>int rounded;
>double source;
> source = 5.6;
> rounded = int ( round ( source ) );
> printf("%d\n",rounded);

Во люди! В C-шной программе пользуют C++ные навороты,
а потом удивляются руганги компилятора. Соответствующую
строку следует заменить на
  rounded = (int)round(source);
Должно покатить.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "округление"
Сообщение от Alexander emailИскать по авторуВ закладки on 05-Апр-03, 18:02  (MSK)

>Во люди! В C-шной программе пользуют C++ные навороты,
>а потом удивляются руганги компилятора. Соответствующую
>строку следует заменить на
>  rounded = (int)round(source);
>Должно покатить.


Простите, но такая прога округляет rounded до 131072...

int main(int argc, char *argv[])
{
int rounded;
float source; //или double source  
source=5.6;
rounded=(int)round(source);
printf("%d %f\n",rounded,source);
return 1;
}

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "округление"
Сообщение от Max Zinal emailИскать по авторуВ закладки on 05-Апр-03, 22:11  (MSK)
Я тоже не могу, тем более что сижу я под Виндой
и в Cygwin'е, причём GCCа моя ну никак не желает
оную функцию round() видеть. Точнее, в <math.h>
оно есть, а вот при линковке его нету, -lm беду
не лечит. Так что, дабы не ломать голову,
предлагаю поступить просто:

-------- BEGIN SAMPLE CODE -----------
#include <stdio.h>

#define round(x) (((x-(int)x)>0.5) ? (1+(int)x) : (int)x)

int main(int argc, char *argv[])
{
int rounded;
float source;
source=5.5;
rounded=(int)round(source);
printf("%d\t%f\n",rounded,source);
return 1;
}
--------- END SAMPLE CODE ------------

  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "округление"
Сообщение от Alexander emailИскать по авторуВ закладки on 05-Апр-03, 22:23  (MSK)
Большое спасибо, Max Zinal,
Все заработало, может ошибка в библиотечных функциях...
Простите за беспокойство. Спасибо.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "округление"
Сообщение от SergeiZz Искать по авторуВ закладки on 07-Апр-03, 10:58  (MSK)
>Все заработало, может ошибка в библиотечных функциях...
Система Red Hat 7.2 (слегка довинчинная).
Вот файл:
// file:        round.c
#include <stdlib.h>
#include <stdio.h>

double round(double);

int main(int argc, char *argv[])
{
        int rounded;
        float source; //или double source
        source=5.6;
        rounded=(int)round(source);
        printf("%d %f\n",rounded,source);
        return 1;
}
// EOF
Вот команда компиляции:
gcc -Wall -lm -o round round.c
Вот результат:
6 5.600000

  Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "округление"
Сообщение от Alexander emailИскать по авторуВ закладки on 07-Апр-03, 15:22  (MSK)
Все круто, работает! Только SergeiZz, если Вас не затруднит, двумя словами объясните зачем надо строка

double round(double);

и почему не надо include <math.h>.

Спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "ISO C99"
Сообщение от SergeiZz Искать по авторуВ закладки on 08-Апр-03, 10:56  (MSK)
>Все круто, работает! Только SergeiZz, если Вас не затруднит, двумя словами объясните
>зачем надо строка
>
>double round(double);
>
>и почему не надо include <math.h>.
>
>Спасибо.
Двумя словами не понятно будет. Нодо хотя бы тремя.
Вы подключаете math.h, чтобы подключить round(), но гуманисты-разработчики
сделали так, что она там есть, но не подключается. Ход их мысли понятен:
round() соответствует стандарту ISO C99, а Вы ж на кернигане и ричи хотите
писать, так. что -- используйте макрос. Отрицательные стороны этого трюка
(не малые) смотрите тут
http://www.experts-exchange.com/Programming/Q_20375304.html
Чтобы понять, как всё это устроено, смотрите math.h и mathcalls.h.
Чтобы преодолеть затруднение поступайте так
1)
#define __USE_ISOC99 I_want_ISO
#include <math.h>
Тут, конечно, извращённый define написан специально, чтобы возникло
желание почитать mathcalls.h. Но это будет работать.
2)
gcc -Wall -D_ISOC99_SOURCE -lm -o round round.c
Но тогда всем, кому Вы передадите текст своей программы будете
рассказывать, как её правильно компилировать.

Ну, и совет а-ля SergeiZz. Добейтесь сначала, чтобы Ваша программа (на C)
компилировалась g++ -Wall, и только тогда можете считать, что это
грамматный текст.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "ISO C99"
Сообщение от Alexander emailИскать по авторуВ закладки on 09-Апр-03, 20:51  (MSK)
>Двумя словами не понятно будет. Нодо хотя бы тремя.
>Вы подключаете math.h, чтобы подключить round(), но гуманисты-разработчики
>сделали так, что она там есть, но не подключается. Ход их мысли
>понятен:
>round() соответствует стандарту ISO C99, а Вы ж на кернигане и ричи
>хотите
>писать, так. что -- используйте макрос. Отрицательные стороны этого трюка
>(не малые) смотрите тут
>http://www.experts-exchange.com/Programming/Q_20375304.html
>Чтобы понять, как всё это устроено, смотрите math.h и mathcalls.h.
>Чтобы преодолеть затруднение поступайте так
>1)
>#define __USE_ISOC99 I_want_ISO
>#include <math.h>
>Тут, конечно, извращённый define написан специально, чтобы возникло
>желание почитать mathcalls.h. Но это будет работать.
>2)
>gcc -Wall -D_ISOC99_SOURCE -lm -o round round.c
>Но тогда всем, кому Вы передадите текст своей программы будете
>рассказывать, как её правильно компилировать.
>
>Ну, и совет а-ля SergeiZz. Добейтесь сначала, чтобы Ваша программа (на C)
>
>компилировалась g++ -Wall, и только тогда можете считать, что это
>грамматный текст.


Спасибо, SergeiZz, за информацию. С ISO C99 в общем понятно...
Отдельная благодарность за совет с g++ -Wall, проблема с переносом прог на другие машины меня очень волнует.
Еще раз спасибо и удач.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

13. "ISO C99"
Сообщение от SergeiZz Искать по авторуВ закладки on 10-Апр-03, 09:10  (MSK)
>Еще раз спасибо и удач.
Большое пожалуйста.

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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