ALT Linux Community general discussions
 help / color / mirror / Atom feed
* [Comm] c language question
@ 2006-11-04 16:14 Andrey Rybak
  2006-11-04 16:18 ` Eugene Ostapets
  0 siblings, 1 reply; 13+ messages in thread
From: Andrey Rybak @ 2006-11-04 16:14 UTC (permalink / raw)
  To: community

Привет, коммунити!
Извините за оффтоп.
Стоит задача (стандартная должно быть) преобразовывать строки  вида
"0.ab" в целое число ab.
Вероятно, я плохо понимаю Си , но самый прямой метод будет выглядеть так:
      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 int main(){
      4         const char* a = "0.16";
      5         printf("%d",(int)(100*atof(a)));
      6         return 0;
      7 }
Но вся беда в том, что это не всегда работает. Например atof запросто
может вернуть 0.159999... в приведенном примере, а приведение типа (int)
просто отбрасывает дробную часть и результат налицо: "0.16"
преобразуется в целое 15.
Проблема наверняка стара как сам Си. Кто знает, как классики решают
подобные задачи?


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Comm] c language question
  2006-11-04 16:14 [Comm] c language question Andrey Rybak
@ 2006-11-04 16:18 ` Eugene Ostapets
  2006-11-04 17:39   ` Хихин Руслан
  2006-11-04 17:44   ` Andrey Rybak
  0 siblings, 2 replies; 13+ messages in thread
From: Eugene Ostapets @ 2006-11-04 16:18 UTC (permalink / raw)
  To: ALT Linux Community

04.11.06, Andrey Rybak<ra iop.kiev.ua> написал(а):
> Привет, коммунити!
> Извините за оффтоп.
> Стоит задача (стандартная должно быть) преобразовывать строки  вида
> "0.ab" в целое число ab.
> Вероятно, я плохо понимаю Си , но самый прямой метод будет выглядеть так:
>       1 #include<stdio.h>
>       2 #include<stdlib.h>
>       3 int main(){
>       4         const char* a = "0.16";
>       5         printf("%d",(int)(100*atof(a)));
>       6         return 0;
>       7 }
Плохо понимаете... Почитайте как храняться дробные числа... А для
решения задачи смотрите man round, man rint
-- 
С уважением,
Евгений Остапец
uin: 23747217
jid: eugene_ostapets@jabber.ru

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Comm] c language question
  2006-11-04 16:18 ` Eugene Ostapets
@ 2006-11-04 17:39   ` Хихин Руслан
  2006-11-04 17:59     ` Eugene Ostapets
  2006-11-04 17:44   ` Andrey Rybak
  1 sibling, 1 reply; 13+ messages in thread
From: Хихин Руслан @ 2006-11-04 17:39 UTC (permalink / raw)
  To: community

[-- Attachment #1: Type: text/plain, Size: 1153 bytes --]

Здравствуйте Eugene Ostapets
  В сообщении от Saturday 04 November 2006 19:18 Eugene Ostapets 
написал(a):
 > 04.11.06, Andrey Rybak<ra iop.kiev.ua> написал(а):
 > > Привет, коммунити!
 > >
 > > Извините за оффтоп.
 > >
 > > Стоит задача (стандартная должно быть) преобразовывать строки 
 > > вида
 > >
 > > "0.ab" в целое число ab.
 > >
 > > Вероятно, я плохо понимаю Си , но самый прямой метод будет
 > > выглядеть так:
 > >
 > >       1 #include<stdio.h>
 > >
 > >       2 #include<stdlib.h>
 > >
 > >       3 int main(){
 > >
 > >       4         const char* a = "0.16";
 > >
 > >       5         printf("%d",(int)(100*atof(a)));
 > >
 > >       6         return 0;
 > >
 > >       7 }
 >
 > Плохо понимаете... Почитайте как храняться дробные числа... А для
 >
 > решения задачи смотрите man round, man rint
Грубо говоря  printf("%d",(int)(100.*atof(a)));
Хотя округление будет всегда до ближайшего целого по абсолютной 
величине.


-- 
  А ещё говорят так  (fortune):
 
Женщина везде оставляет свою шляпу, а мужчина - голову.
		-- Немецкая пословица
________________________________________________________________________
С уважением Хихин Руслан

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Comm] c language question
  2006-11-04 16:18 ` Eugene Ostapets
  2006-11-04 17:39   ` Хихин Руслан
@ 2006-11-04 17:44   ` Andrey Rybak
  2006-11-04 17:53     ` Eugene Ostapets
  1 sibling, 1 reply; 13+ messages in thread
From: Andrey Rybak @ 2006-11-04 17:44 UTC (permalink / raw)
  To: ALT Linux Community

Eugene Ostapets wrote:
> 04.11.06, Andrey Rybak<ra iop.kiev.ua> написал(а):
>   
>> Привет, коммунити!
>> Извините за оффтоп.
>> Стоит задача (стандартная должно быть) преобразовывать строки  вида
>> "0.ab" в целое число ab.
>> Вероятно, я плохо понимаю Си , но самый прямой метод будет выглядеть так:
>>       1 #include<stdio.h>
>>       2 #include<stdlib.h>
>>       3 int main(){
>>       4         const char* a = "0.16";
>>       5         printf("%d",(int)(100*atof(a)));
>>       6         return 0;
>>       7 }
>>     
> Плохо понимаете... Почитайте как храняться дробные числа... А для
> решения задачи смотрите man round, man rint
>   
они округляют только в заданном направлении, т.е. надо еще направление
округления задавать. (Или atof гарантированно возвращает, в данном
примере, либо .16 либо 15.99999... ? Тогда с дирекшионом проблем нет)
И чем эти функции отличаются от ceil & floor? Опять-таки не избежать
явного приведения типов (int)
Это я к тому - а что ж я плохо понимаю тогда?


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Comm] c language question
  2006-11-04 17:44   ` Andrey Rybak
@ 2006-11-04 17:53     ` Eugene Ostapets
  2006-11-04 18:24       ` Andrey Rybak
  0 siblings, 1 reply; 13+ messages in thread
From: Eugene Ostapets @ 2006-11-04 17:53 UTC (permalink / raw)
  To: ALT Linux Community

04.11.06, Andrey Rybak<ra iop.kiev.ua> написал(а):
> > Плохо понимаете... Почитайте как храняться дробные числа... А для
> > решения задачи смотрите man round, man rint
> >
> они округляют только в заданном направлении, т.е. надо еще направление
> округления задавать. (Или atof гарантированно возвращает, в данном
> примере, либо .16 либо 15.99999... ? Тогда с дирекшионом проблем нет)
> И чем эти функции отличаются от ceil & floor? Опять-таки не избежать
> явного приведения типов (int)
> Это я к тому - а что ж я плохо понимаю тогда?
Разницу между
a=0.16
a=0.2*0.8
В первом случае сохранится 0.16, а во втором - 0.1599999999999...
Округлять приходится всегда, а уже потом заниматься приведением
типов...
-- 
С уважением,
Евгений Остапец
uin: 23747217
jid: eugene_ostapets@jabber.ru

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Comm] c language question
  2006-11-04 17:39   ` Хихин Руслан
@ 2006-11-04 17:59     ` Eugene Ostapets
  2006-11-04 18:41       ` Хихин Руслан
  0 siblings, 1 reply; 13+ messages in thread
From: Eugene Ostapets @ 2006-11-04 17:59 UTC (permalink / raw)
  To: ALT Linux Community

04.11.06, Хихин Руслан<hihin rambler.ru> написал(а):
> Грубо говоря  printf("%d",(int)(100.*atof(a)));
> Хотя округление будет всегда до ближайшего целого по абсолютной
> величине.
Хм... Округление? А не обрезание дробной части???

[eugene@mobile 3]$ cat 1.c
#include <stdio.h>
int main (int argc, char *argv[]) {
float a=0.16;
printf("a\t%f\n",a);
printf("a*100\t%d\n",(int)(100*a));
}

[eugene@mobile 3]$ gcc 1.c
[eugene@mobile 3]$ ./a.out
a       0.160000
a*100   15

-- 
С уважением,
Евгений Остапец
uin: 23747217
jid: eugene_ostapets@jabber.ru

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Comm] c language question
  2006-11-04 17:53     ` Eugene Ostapets
@ 2006-11-04 18:24       ` Andrey Rybak
  2006-11-04 18:30         ` Eugene Ostapets
  0 siblings, 1 reply; 13+ messages in thread
From: Andrey Rybak @ 2006-11-04 18:24 UTC (permalink / raw)
  To: ALT Linux Community


>> (Или atof гарантированно возвращает, в данном
>> примере, либо .16 либо 15.99999... ?
-----------------------  для меня важно это в контексте вашего ответа
>>  Тогда с дирекшионом проблем нет)
>> И чем эти функции отличаются от ceil & floor? Опять-таки не избежать
>> явного приведения типов (int)
>> Это я к тому - а что ж я плохо понимаю тогда?
>>     
> Разницу между
> a=0.16
> a=0.2*0.8
> В первом случае сохранится 0.16, а во втором - 0.1599999999999...
> Округлять приходится всегда, а уже потом заниматься приведением
> типов...
>   
Хорошо - уточню часть моего вопроса.
Перед округлением обязательно направление округления определять? Т.е.
определить ближайшие целые (они с обеих сторон), а потом в зависимости
от того, кто ближе выбирать направление округления?


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Comm] c language question
  2006-11-04 18:24       ` Andrey Rybak
@ 2006-11-04 18:30         ` Eugene Ostapets
  2006-11-04 18:51           ` Andrey Rybak
  0 siblings, 1 reply; 13+ messages in thread
From: Eugene Ostapets @ 2006-11-04 18:30 UTC (permalink / raw)
  To: ALT Linux Community

04.11.06, Andrey Rybak<ra iop.kiev.ua> написал(а):
>
> >> (Или atof гарантированно возвращает, в данном
> >> примере, либо .16 либо 15.99999... ?
> -----------------------  для меня важно это в контексте вашего ответа
> >>  Тогда с дирекшионом проблем нет)
> >> И чем эти функции отличаются от ceil & floor? Опять-таки не избежать
> >> явного приведения типов (int)
> >> Это я к тому - а что ж я плохо понимаю тогда?
> >>
> > Разницу между
> > a=0.16
> > a=0.2*0.8
> > В первом случае сохранится 0.16, а во втором - 0.1599999999999...
> > Округлять приходится всегда, а уже потом заниматься приведением
> > типов...
> >
> Хорошо - уточню часть моего вопроса.
> Перед округлением обязательно направление округления определять? Т.е.
> определить ближайшие целые (они с обеих сторон), а потом в зависимости
> от того, кто ближе выбирать направление округления?
Обычно направление округления определяется задачей... Для большинства
случаев подходит правило a<0.5 - a=0, a>=0.5 - a=1, и это делает
round, но для бухгалтерии такой варант не подходит - там свои
заморочки когда и где окргулять к ближайшему целому, а когда к
ближайшему большему целому... Так что метод округления зависит от
полной задачи...
> _______________________________________________
> Community mailing list
> Community@lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/community


-- 
С уважением,
Евгений Остапец
uin: 23747217
jid: eugene_ostapets@jabber.ru

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Comm] c language question
  2006-11-04 17:59     ` Eugene Ostapets
@ 2006-11-04 18:41       ` Хихин Руслан
  2006-11-04 18:55         ` Michael Holzman
  0 siblings, 1 reply; 13+ messages in thread
From: Хихин Руслан @ 2006-11-04 18:41 UTC (permalink / raw)
  To: community

[-- Attachment #1: Type: text/plain, Size: 580 bytes --]

Здравствуйте Eugene Ostapets
  В сообщении от Saturday 04 November 2006 20:59 Eugene Ostapets 
написал(a):

 >
 > Хм... Округление? А не обрезание дробной части???
 >
 >
Ну, можно и так сказать :)
А можно сказать, что обрезание дробной части - частный случай 
округления. 
Типа raund(a) = 
{

r = (int) (a+0.5) 
a%1 !=0.5;
иначе 
r =(int) a;

вернём r :)
}

-- 
  А ещё говорят так  (fortune):
 
Прежде всего нужны факты, а уж потом можешь делать с ними, что хочешь.
		-- Марк Твен
________________________________________________________________________
С уважением Хихин Руслан

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Comm] c language question
  2006-11-04 18:30         ` Eugene Ostapets
@ 2006-11-04 18:51           ` Andrey Rybak
  0 siblings, 0 replies; 13+ messages in thread
From: Andrey Rybak @ 2006-11-04 18:51 UTC (permalink / raw)
  To: ALT Linux Community


> Обычно направление округления определяется задачей... Для большинства
> случаев подходит правило a<0.5 - a=0, a>=0.5 - a=1, и это делает
> round, но для бухгалтерии такой варант не подходит - там свои
> заморочки когда и где окргулять к ближайшему целому, а когда к
> ближайшему большему целому... Так что метод округления зависит от
> полной задачи...
>   
Тьфу ты - пора идти спать. Меня сбила с толку фраза из мана:
       round, roundf, roundl - round to nearest integer, away from zero
"away from zero" я прочитал как "округление от нуля" т.е. вправо.
Маленький эксперимент все расставил по местам. Спасибо за подсказки!


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Comm] c language question
  2006-11-04 18:41       ` Хихин Руслан
@ 2006-11-04 18:55         ` Michael Holzman
  2006-11-04 19:17           ` Хихин Руслан
  0 siblings, 1 reply; 13+ messages in thread
From: Michael Holzman @ 2006-11-04 18:55 UTC (permalink / raw)
  To: hihin, ALT Linux Community

Я, наверное, чего-то не понимаю. Поэтому, вопрос: почему никто не
рассматривал что-нибудь вроде

for(i = 0; a[i] && a[i] == '0'; i++);
if(a[i] == '.')
   i++;

printf("%s\n", a+i);

-- 
Regards,
    Michael Holzman

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Comm] c language question
  2006-11-04 18:55         ` Michael Holzman
@ 2006-11-04 19:17           ` Хихин Руслан
  2006-11-04 20:32             ` Michael Holzman
  0 siblings, 1 reply; 13+ messages in thread
From: Хихин Руслан @ 2006-11-04 19:17 UTC (permalink / raw)
  To: community

[-- Attachment #1: Type: text/plain, Size: 832 bytes --]

Здравствуйте Michael Holzman
  В сообщении от Saturday 04 November 2006 21:55 Michael Holzman 
написал(a):
 > Я, наверное, чего-то не понимаю. Поэтому, вопрос: почему никто не
 >
 > рассматривал что-нибудь вроде
 >
 >
 >
 > for(i = 0; a[i] && a[i] == '0'; i++);
 >
 > if(a[i] == '.')
 >
 >    i++;
 >
 > printf("%s\n", a+i);
Честно - не понял алгоритм :)
Хотя идею - понял - просто отбросить целую часть и ведущие нули из 
строки, а то, что осталось от строки выдать на печать. Просто 
1) следующим действием может оказаться прибавить к полученному числу 
какую-нибудь константу или т.п.
2) а если там 0.011 ?

-- 
  А ещё говорят так  (fortune):
 
> service holywar start
ээ. а копирайт ставить кто будет? :)
		-- gns in smoke-room@
________________________________________________________________________
С уважением Хихин Руслан

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Comm] c language question
  2006-11-04 19:17           ` Хихин Руслан
@ 2006-11-04 20:32             ` Michael Holzman
  0 siblings, 0 replies; 13+ messages in thread
From: Michael Holzman @ 2006-11-04 20:32 UTC (permalink / raw)
  To: hihin, ALT Linux Community

On 11/4/06, Хихин Руслан <hihin@rambler.ru> wrote:
> Честно - не понял алгоритм :)
> Хотя идею - понял - просто отбросить целую часть и ведущие нули из
> строки, а то, что осталось от строки выдать на печать. Просто
> 1) следующим действием может оказаться прибавить к полученному числу
> какую-нибудь константу или т.п.
> 2) а если там 0.011 ?
1) поставьте atoi вместо printf
2) цикл остановится на точке, а   atoi(011) = atoi(11)

-- 
Regards,
    Michael Holzman

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2006-11-04 20:32 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-11-04 16:14 [Comm] c language question Andrey Rybak
2006-11-04 16:18 ` Eugene Ostapets
2006-11-04 17:39   ` Хихин Руслан
2006-11-04 17:59     ` Eugene Ostapets
2006-11-04 18:41       ` Хихин Руслан
2006-11-04 18:55         ` Michael Holzman
2006-11-04 19:17           ` Хихин Руслан
2006-11-04 20:32             ` Michael Holzman
2006-11-04 17:44   ` Andrey Rybak
2006-11-04 17:53     ` Eugene Ostapets
2006-11-04 18:24       ` Andrey Rybak
2006-11-04 18:30         ` Eugene Ostapets
2006-11-04 18:51           ` Andrey Rybak

ALT Linux Community general discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/community/0 community/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 community community/ http://lore.altlinux.org/community \
		mandrake-russian@linuxteam.iplabs.ru community@lists.altlinux.org community@lists.altlinux.ru community@lists.altlinux.com
	public-inbox-index community

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.community


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git