Страниц: [1]
  Печать  
Автор Тема: округление :(  (Прочитано 7911 раз)
akulp
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« : Июля 03, 2004, 02:40:08 pm »

hi, all!  можь кто подскажет,
надо округлить число до целого через преобразование типа,
что то вроде
 int i = (int)12.9
после чего i==13
ANSI на этот случай предлагает обрезать(i==12), что компиляторы и делают.
Но в VC флажок есть /QIfist, который заставляет компилер проводить нормальное округление.
Что для этого в qcc есть? тоже флаг(какой?) али что еще прикрутили?. кто знаит скиньте сообщениица.
Спассибо.
Записан
Shrek
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #1 : Июля 03, 2004, 03:03:01 pm »

Посмотрите функции ceil() и floor()
Данные функции позволят написать программу не зависящую
от компилятора
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #2 : Июля 03, 2004, 04:34:58 pm »

int i = (int)(12.9 + .5);
Записан

akulp
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #3 : Июля 03, 2004, 09:40:35 pm »

2 Shrek:
 совет дельный, но тока не могу я вызывать таки функции, надо чтобы именно на преобразование типов. Тип как параметр шаблона идет и заранее не известно что чему присваиваем int = int или int = double
2 lestat:
 гы гы, хороша шутка, даже применима где нить наверняка. Тока криво и время ест, мое и процессорное.

ps неужель флага на gcc не придумали?
Записан
Shrek
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #4 : Июля 05, 2004, 09:25:51 am »

to akulp:
1.Давайте различать два понятия таких как ПРЕОБРАЗОВАНИЕ и ОКРУГЛЕНИЕ.
 ПРЕОБРАЗОВАНИЕ можно использовать в качестве округления, однако нужно учитывать накладываемые ограничения.
2. По поводу кривизны примера преведенного lestat можно поспорить. Вы уверены что "в VC флажок есть /QIfist, который заставляет компилер проводить нормальное округление" работает ровнее.
Плюс в том что, что не тратится ваше время, а процессорное даже NOP жрет. Вопрос только в том, как велико это время?


P.S. Невсегда можно убить двух зайцев одним выстрелом
Записан
akulp
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #5 : Июля 06, 2004, 08:52:36 am »

Вы уверены что "в VC флажок есть /QIfist, который заставляет компилер проводить нормальное округление" работает ровнее
уверен, дело не в VC, дело в алгоритме округления. Если сие интересно то можно сравнить по инструкциям процессора, тока эта совсем другая история.
Бяда в общем
Записан
Shrek
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #6 : Июля 06, 2004, 09:34:02 am »

А не могли ли вы тогда превести этот алгоритм?

У вас что вся программа построена на этом преобразовании, или вы постоянно чтото преобразовываете?

Почему вы не знаете что чему присваевать int = int или int = double, вы же программу пишите.
А вас не смущает тогда,  то что даже без округления строка
вида int = double тратит значительное процессорное время. Здесь я сказал "значительное" с тем расчетом, что как вы сказали int i = (int)(12.9 + .5); для вас критично по времени.
Записан
MikeP
Участник
*
Offline Offline

Сообщений: 6


Просмотр профиля WWW
« Ответ #7 : Июля 06, 2004, 10:41:54 am »


"в VC флажок есть /QIfist, который заставляет компилер проводить нормальное округление"


Этот флажек просто указывает компилятору всегда использовать округление средствами сопроцессора (выталкивание из стека сопроцессора в память).
Это снимает необходимость программно округлять числа, но занимает значительное время при выталкивании значений в область памяти, не выровненную на границу в 8 байт (на архитектуре х86, по крайней мере). Настройку правил округления в мат. сопроцессоре вам нужно задать в параметрах компилятора или править самому.
Это что касается VC.
Что же касается gcc - тут ситуёвина сложнее - слишком много разных флагов и все их мне в свое время исследовать не удалось - а по сему можно только посоветовать копать доки на GNU.ORG и надеяться, что портированная в QNX версия понимает тот флаг, который вам нужен
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #8 : Июля 06, 2004, 12:12:44 pm »

Настоящие программисты, кстати, вообще не используют floating point И уж тем более не зависят от компилятора и никогда не экономят такты на округлении.

akulp
гы гы, хороша шутка, даже применима где нить наверняка. Тока криво и время ест, мое и процессорное


Даренному коню в зубы не смотрят. Есть - бери.
Записан

lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #9 : Июля 06, 2004, 12:33:02 pm »

А вот это читать до округления http://mega-nerd.com/FPcast/

И эти люди мне рассказывают про потерянные такты на операцию faddp ? Тьфу ...
Записан

akulp
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #10 : Июля 06, 2004, 07:41:29 pm »

нету флага, ну и фиг с ним,
вот lestat'у за ссылку спасибо, подглядел, округлил,
переписав при этом double в Double, еще и сравнение сделал через == .
А настоящие в кодах пишут, им тада и компилятор не нужен , и округляют в уме.усе.
Записан
Страниц: [1]
  Печать  
 
Перейти в: