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