ALT Linux Community general discussions
 help / color / mirror / Atom feed
* [Comm] value overflow on C
@ 2006-02-22 11:25 Andrey Rybak
  2006-02-22 11:51 ` Damir Shayhutdinov
  2006-02-22 17:28 ` spider
  0 siblings, 2 replies; 14+ messages in thread
From: Andrey Rybak @ 2006-02-22 11:25 UTC (permalink / raw)
  To: Список
	рассылки
	по
	использованию
	дистрибутивов
	ALT Linux

Привет коммунити!
Вопрос по си.
Есть необходимость определять, когда происходит превышение максимального 
значения стандартного типа при арифметических операциях.
Типа такого: значение переменной errno становится равной ERANGE, если 
мат. функция (например pow() из math.h) имеет своим результатом значение 
больше, чем может быть представлено данным типом. Что-то подобное для 
операций сложения и умножения имеется?
Эксперимент показал,что errno остается равным нулю при прибавлении 
единицы к максимальному int . И при выполнении прога никак не реагирует. 
Работает дальше, но с уже неверными величинами.
Гугление и чтение Кернигана и Ричи не дали результата.
Что посоветуете?
Или ссылкой какой поделитесь.
Немного ОТ, но прога то на альте :-)



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

* Re: [Comm] value overflow on C
  2006-02-22 11:25 [Comm] value overflow on C Andrey Rybak
@ 2006-02-22 11:51 ` Damir Shayhutdinov
  2006-02-22 12:51   ` Andrey Rybak
  2006-02-22 17:28 ` spider
  1 sibling, 1 reply; 14+ messages in thread
From: Damir Shayhutdinov @ 2006-02-22 11:51 UTC (permalink / raw)
  To: Andrey Rybak
  Cc: Список
	рассылки
	по
	использованию
	дистрибутивов
	ALT Linux

On Wed, Feb 22, 2006 at 01:25:34PM +0200, Andrey Rybak wrote:
> Привет коммунити!
> Вопрос по си.
> Есть необходимость определять, когда происходит превышение максимального 
> значения стандартного типа при арифметических операциях.
> Типа такого: значение переменной errno становится равной ERANGE, если 
> мат. функция (например pow() из math.h) имеет своим результатом значение 
> больше, чем может быть представлено данным типом. Что-то подобное для 
> операций сложения и умножения имеется?
> Эксперимент показал,что errno остается равным нулю при прибавлении 
> единицы к максимальному int . И при выполнении прога никак не реагирует. 
> Работает дальше, но с уже неверными величинами.
> Гугление и чтение Кернигана и Ричи не дали результата.
> Что посоветуете?
ИМХО глобально решить проблему можно только если использовать другие языки.
В случае целочисленных выражений проблему можно сгладить, просто взяв int
тип пошире (например, long long).

-- 
WBR,
Damir Shayhutdinov


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

* Re: [Comm] value overflow on C
  2006-02-22 11:51 ` Damir Shayhutdinov
@ 2006-02-22 12:51   ` Andrey Rybak
  2006-02-22 12:56     ` Damir Shayhutdinov
  0 siblings, 1 reply; 14+ messages in thread
From: Andrey Rybak @ 2006-02-22 12:51 UTC (permalink / raw)
  To: Список
	рассылки
	по
	использованию
	дистрибутивов
	ALT Linux


> ИМХО глобально решить проблему можно только если использовать другие языки.
> В случае целочисленных выражений проблему можно сгладить, просто взяв int
> тип пошире (например, long long).
>
>   
В том то и дело, что взять тип пошире - не кошерно в моем случае.
Расчеты величин проходят в их (величин) зонах сингулярности, где область 
значений резко увеличивается  даже при малых изменениях аргумента. В 
тоже время увеличив ширину типа, я увеличу и так большое время счета. 
Поэтому мне надо просто детектировать, что я подошел к предельным 
величинам. Просто условными оператороми (if например) эта задача 
решается неудовлетворительно.
А вопрос у меня возник, потому что помнится мне, что в ассемблере есть 
флажок переполнения байта величины (при инкременте например), поэтому 
думается мне, что при близости Си к низкоуровнему программированию, 
такая фича (определение превышения допустимой величины) должна быть. 
Именно поэтому я привел пример с ERANGE.

Есть еще идеи?


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

* Re: [Comm] value overflow on C
  2006-02-22 12:51   ` Andrey Rybak
@ 2006-02-22 12:56     ` Damir Shayhutdinov
  2006-02-22 13:41       ` Andrey Rybak
  0 siblings, 1 reply; 14+ messages in thread
From: Damir Shayhutdinov @ 2006-02-22 12:56 UTC (permalink / raw)
  To: Andrey Rybak
  Cc: Список
	рассылки
	по
	использованию
	дистрибутивов
	ALT Linux

On Wed, Feb 22, 2006 at 02:51:18PM +0200, Andrey Rybak wrote:
> 
> > ИМХО глобально решить проблему можно только если использовать другие языки.
> > В случае целочисленных выражений проблему можно сгладить, просто взяв int
> > тип пошире (например, long long).
> >
> >   
> В том то и дело, что взять тип пошире - не кошерно в моем случае.
> Расчеты величин проходят в их (величин) зонах сингулярности, где область 
> значений резко увеличивается  даже при малых изменениях аргумента. В 
> тоже время увеличив ширину типа, я увеличу и так большое время счета. 
Использование 64битных вычислений позволяет этого избежать.

> Поэтому мне надо просто детектировать, что я подошел к предельным 
> величинам. Просто условными оператороми (if например) эта задача 
> решается неудовлетворительно.
Почему? Даже с флажком от условного перехода (if) вы никуда не денетесь :(

> А вопрос у меня возник, потому что помнится мне, что в ассемблере есть 
> флажок переполнения байта величины (при инкременте например), поэтому 
> думается мне, что при близости Си к низкоуровнему программированию, 
> такая фича (определение превышения допустимой величины) должна быть. 
> Именно поэтому я привел пример с ERANGE.
> 
> Есть еще идеи?
Написать на асме функцию сложения, использующую этот флаг и использовать ее, 
определив как inline для ускорения например. Правда это непортабельно.

-- 
WBR,
Damir Shayhutdinov


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

* Re: [Comm] value overflow on C
  2006-02-22 12:56     ` Damir Shayhutdinov
@ 2006-02-22 13:41       ` Andrey Rybak
  2006-02-22 14:23         ` Serge Skorokhodov
  2006-02-22 19:54         ` Kosserior
  0 siblings, 2 replies; 14+ messages in thread
From: Andrey Rybak @ 2006-02-22 13:41 UTC (permalink / raw)
  To: Список
	рассылки
	по
	использованию
	дистрибутивов
	ALT Linux


>   
>> Поэтому мне надо просто детектировать, что я подошел к предельным 
>> величинам. Просто условными оператороми (if например) эта задача 
>> решается неудовлетворительно.
>>     
> Почему? Даже с флажком от условного перехода (if) вы никуда не денетесь :(
>
>   
Я имел ввиду if c операторами "<" и ">". А так конечно - флаг 
используется вместе с if.
>> А вопрос у меня возник, потому что помнится мне, что в ассемблере есть 
>> флажок переполнения байта величины (при инкременте например), поэтому 
>> думается мне, что при близости Си к низкоуровнему программированию, 
>> такая фича (определение превышения допустимой величины) должна быть. 
>> Именно поэтому я привел пример с ERANGE.
>>
>> Есть еще идеи?
>>     
> Написать на асме функцию сложения, использующую этот флаг и использовать ее, 
> определив как inline для ускорения например. Правда это непортабельно.
>
>   
Не хочу, а придется. Но, кажется, должно быть чисто сишное решение.
Может еще кто что скажет?


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

* Re: [Comm] value overflow on C
  2006-02-22 13:41       ` Andrey Rybak
@ 2006-02-22 14:23         ` Serge Skorokhodov
  2006-02-22 14:36           ` Andrey Rybak
  2006-02-22 19:54         ` Kosserior
  1 sibling, 1 reply; 14+ messages in thread
From: Serge Skorokhodov @ 2006-02-22 14:23 UTC (permalink / raw)
  To: ALT Linux Community

>>> Есть еще идеи?
>>>     
>> Написать на асме функцию сложения, использующую этот флаг и
>> использовать ее, определив как inline для ускорения например.
>> Правда это непортабельно.
>>
>>   
> Не хочу, а придется. Но, кажется, должно быть чисто сишное
> решение. Может еще кто что скажет?

По определению языка C возможность отслеживать переполнение
целочисленных типов не предусмотрена:( Так что надо смотреть в
сторону непереносимых платформозависимых решений и расширений
конкретного компилятора для конкретной платформы. Помимо
написания на [встроенном] asm'е, можно еще подумать про
псевдопеременные-регистры типа _EAX и т.д. (в нашем случае нужен
регистр флагов процессора). Есть ли такие возможности в Вашем
компиляторе для Вашей целевой платформы: к языку С никакого
отношения;)

При необходимости оформить что-либо платформозависимое для
нескольких платформ в языке С обычно используют
макроопределения;)

Вот и все идеи, которые приходят в голову... ;)

-- 
Best regards,
 Serge Skorokhodov



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

* Re: [Comm] value overflow on C
  2006-02-22 14:23         ` Serge Skorokhodov
@ 2006-02-22 14:36           ` Andrey Rybak
  2006-02-22 15:13             ` Yura Kalinichenko
  2006-02-23  9:39             ` Serge Skorokhodov
  0 siblings, 2 replies; 14+ messages in thread
From: Andrey Rybak @ 2006-02-22 14:36 UTC (permalink / raw)
  To: ALT Linux Community


>
> По определению языка C возможность отслеживать переполнение
> целочисленных типов
А типов float & double?
Я говорил не только про целочисленные, но и встроенные 
арифметические(int, double). Целочисленнные - это только для примера.
>  не предусмотрена:( Так что надо смотреть в
> сторону непереносимых платформозависимых решений и расширений
> конкретного компилятора для конкретной платформы. Помимо
> написания на [встроенном] asm'е, можно еще подумать про
> псевдопеременные-регистры типа _EAX и т.д. (в нашем случае нужен
> регистр флагов процессора). Есть ли такие возможности в Вашем
> компиляторе для Вашей целевой платформы: к языку С никакого
> отношения;)
>   
gcc version 3.3.4 20040817 (ALT Linux, build 3.3.4-alt1)
> При необходимости оформить что-либо платформозависимое для
> нескольких платформ в языке С обычно используют
> макроопределения;)
>
> Вот и все идеи, которые приходят в голову... ;)
>
>   



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

* Re: [Comm] value overflow on C
  2006-02-22 14:36           ` Andrey Rybak
@ 2006-02-22 15:13             ` Yura Kalinichenko
  2006-02-23  9:39             ` Serge Skorokhodov
  1 sibling, 0 replies; 14+ messages in thread
From: Yura Kalinichenko @ 2006-02-22 15:13 UTC (permalink / raw)
  To: ALT Linux Community

В Срд, 22/02/2006 в 16:36 +0200, Andrey Rybak пишет:
> >
> > По определению языка C возможность отслеживать переполнение
> > целочисленных типов
> А типов float & double?

SIGFPE ?




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

* Re: [Comm] value overflow on C
  2006-02-22 11:25 [Comm] value overflow on C Andrey Rybak
  2006-02-22 11:51 ` Damir Shayhutdinov
@ 2006-02-22 17:28 ` spider
  2006-02-22 18:19   ` Хихин Руслан
  2006-02-25 12:07   ` Andrey Rybak
  1 sibling, 2 replies; 14+ messages in thread
From: spider @ 2006-02-22 17:28 UTC (permalink / raw)
  To: ALT Linux Community

Andrey Rybak wrote:
> Привет коммунити!
> Вопрос по си.
> Есть необходимость определять, когда происходит превышение максимального 
> значения стандартного типа при арифметических операциях.
> Типа такого: значение переменной errno становится равной ERANGE, если 
> мат. функция (например pow() из math.h) имеет своим результатом значение 
> больше, чем может быть представлено данным типом. Что-то подобное для 
> операций сложения и умножения имеется?
man fenv


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

* Re: [Comm] value overflow on C
  2006-02-22 17:28 ` spider
@ 2006-02-22 18:19   ` Хихин Руслан
  2006-02-25 12:07   ` Andrey Rybak
  1 sibling, 0 replies; 14+ messages in thread
From: Хихин Руслан @ 2006-02-22 18:19 UTC (permalink / raw)
  To: community

Здравствуйте spider
  В сообщении от 22 февраля 2006 20:28 spider написал(a):
 > Andrey Rybak wrote:
 > > Привет коммунити!
 > >
 > > Вопрос по си.
 > >
 > > Есть необходимость определять, когда происходит превышение
 > > максимального
 > >
 > > значения стандартного типа при арифметических операциях.
 > >
 > > Типа такого: значение переменной errno становится равной ERANGE,
 > > если
 > >
 > > мат. функция (например pow() из math.h) имеет своим результатом
 > > значение
 > >
 > > больше, чем может быть представлено данным типом. Что-то подобное
 > > для
 > >
 > > операций сложения и умножения имеется?
 >
 > man fenv
Ну и man nan, apropos finity и далее. 


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


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

* [Comm]  value overflow on C
  2006-02-22 13:41       ` Andrey Rybak
  2006-02-22 14:23         ` Serge Skorokhodov
@ 2006-02-22 19:54         ` Kosserior
  1 sibling, 0 replies; 14+ messages in thread
From: Kosserior @ 2006-02-22 19:54 UTC (permalink / raw)
  To: 'ALT Linux Community'

> Может еще кто что скажет?

Вряд ли это сильно поможет, но если мне память не изменяет,
то эта возможность зависит, то ли от компилятора, то ли от
его настроек.

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

* Re: [Comm] value overflow on C
  2006-02-22 14:36           ` Andrey Rybak
  2006-02-22 15:13             ` Yura Kalinichenko
@ 2006-02-23  9:39             ` Serge Skorokhodov
  2006-02-23  9:51               ` Kaydannik Axel
  1 sibling, 1 reply; 14+ messages in thread
From: Serge Skorokhodov @ 2006-02-23  9:39 UTC (permalink / raw)
  To: ALT Linux Community

>> По определению языка C возможность отслеживать переполнение
>> целочисленных типов

> А типов float & double? Я говорил не только про целочисленные,
> но и встроенные арифметические(int, double). Целочисленнные -
> это только для примера.

Не являюсь знатоком численных дел в С, но в плавающей точке вроде
при всяких неожиданностях/ошибках генерируются аппаратные
исключения, результаты могут принимать значение несигнальных NaN,
+-Inf etc. Еще раз, я тут не спец.

> gcc version 3.3.4 20040817 (ALT Linux, build 3.3.4-alt1)

Увы, я не знаю детальных возможностей и расширений этого
компилятора:(

Если речь идет о C++, то в boost есть библиотека безопасного
преобразования числовых типов, которая вроде позволяет
генерировать единообразные исключения при выходе за диапазоны и
т.д. Деталей не помню, но помню, что скорость работы программы
такие проверки не улучшают:(

Кроме того, можно попробовать библиотеки для вычислений с
произвольной точностью типа MAPM. Это может сильно все упростить,
причем настолько, что потеря эффективности на "длинную"
арифметику будут в значительной степени скомпенсированы
упрощением алгоритмов и отсутствием проверок.

Думать надо и искать... ;)

-- 
Best regards,
 Serge Skorokhodov                            mailto:suralis-s@mtu-net.ru



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

* Re: [Comm] value overflow on C
  2006-02-23  9:39             ` Serge Skorokhodov
@ 2006-02-23  9:51               ` Kaydannik Axel
  0 siblings, 0 replies; 14+ messages in thread
From: Kaydannik Axel @ 2006-02-23  9:51 UTC (permalink / raw)
  To: Serge Skorokhodov, ALT Linux Community

Проще. Когда привышаешь маскимальное от возможного то он начинается с начала.

Что же касается маскимально возможного то в реалиях оно больше чем в
документаци. А ля НА ВСЯКИЙ СЛУЧАЙ.

23.02.06, Serge Skorokhodov<suralis-s@mtu-net.ru> написал(а):
> >> По определению языка C возможность отслеживать переполнение
> >> целочисленных типов
>
> > А типов float & double? Я говорил не только про целочисленные,
> > но и встроенные арифметические(int, double). Целочисленнные -
> > это только для примера.
>
> Не являюсь знатоком численных дел в С, но в плавающей точке вроде
> при всяких неожиданностях/ошибках генерируются аппаратные
> исключения, результаты могут принимать значение несигнальных NaN,
> +-Inf etc. Еще раз, я тут не спец.
>
> > gcc version 3.3.4 20040817 (ALT Linux, build 3.3.4-alt1)
>
> Увы, я не знаю детальных возможностей и расширений этого
> компилятора:(
>
> Если речь идет о C++, то в boost есть библиотека безопасного
> преобразования числовых типов, которая вроде позволяет
> генерировать единообразные исключения при выходе за диапазоны и
> т.д. Деталей не помню, но помню, что скорость работы программы
> такие проверки не улучшают:(
>
> Кроме того, можно попробовать библиотеки для вычислений с
> произвольной точностью типа MAPM. Это может сильно все упростить,
> причем настолько, что потеря эффективности на "длинную"
> арифметику будут в значительной степени скомпенсированы
> упрощением алгоритмов и отсутствием проверок.
>
> Думать надо и искать... ;)
>
> --
> Best regards,
>  Serge Skorokhodov                            mailto:suralis-s@mtu-net.ru
>
> _______________________________________________
> Community mailing list
> Community@lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/community

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

* Re: [Comm] value overflow on C
  2006-02-22 17:28 ` spider
  2006-02-22 18:19   ` Хихин Руслан
@ 2006-02-25 12:07   ` Andrey Rybak
  1 sibling, 0 replies; 14+ messages in thread
From: Andrey Rybak @ 2006-02-25 12:07 UTC (permalink / raw)
  To: ALT Linux Community


> man fenv
> _______________________________________________
>   
Это именно то, что нужно!
Спасибо.


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

end of thread, other threads:[~2006-02-25 12:07 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-02-22 11:25 [Comm] value overflow on C Andrey Rybak
2006-02-22 11:51 ` Damir Shayhutdinov
2006-02-22 12:51   ` Andrey Rybak
2006-02-22 12:56     ` Damir Shayhutdinov
2006-02-22 13:41       ` Andrey Rybak
2006-02-22 14:23         ` Serge Skorokhodov
2006-02-22 14:36           ` Andrey Rybak
2006-02-22 15:13             ` Yura Kalinichenko
2006-02-23  9:39             ` Serge Skorokhodov
2006-02-23  9:51               ` Kaydannik Axel
2006-02-22 19:54         ` Kosserior
2006-02-22 17:28 ` spider
2006-02-22 18:19   ` Хихин Руслан
2006-02-25 12:07   ` 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