* [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