Страниц: 1 [2] 3
  Печать  
Автор Тема: Платформенно-зависимые типы в C  (Прочитано 16026 раз)
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #15 : Июля 13, 2009, 09:38:04 pm »

Тогда вопрос задан неверно, нужно было спрашивать про представление типов в памяти, а не просто представление типов, которые стандарт чётко расписывает.
А что такое "просто представление типов"?
Это то, что Эдик назвал representation. Стандарт говорит только о количестве бит в типе, в основном фразами "не менее", либо столько, сколько указано в <limits.h>. Представление целочисленного типа - это интегральный тип данных, который может принимать значение максимум TYPE_MAX и минимум TYPE_MIN.
« Последнее редактирование: Июля 13, 2009, 09:46:40 pm от lestat » Записан

bbceler
Full Member
***
Offline Offline

Сообщений: 149


Просмотр профиля WWW
« Ответ #16 : Июля 13, 2009, 09:57:29 pm »

ed1k, ты наверное не проснулся Smiley
Кошмар, никто даже стандарт не открывал ... Smiley
lestat я вижу что мир одинаковый. У нас тоже никому не хочеться смотреть ....
А мне кажеться что все таки в целом вопрос слишком роздулся.
Для начяльного изучения языка С ответ 7 вполни достоточень.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #17 : Июля 13, 2009, 10:05:35 pm »

lestat
Для начяльного изучения языка С ответ 7 вполни достоточень.
Может ты и прав, нужно в себе давить чувство торжествующей справедливости Smiley Но всё равно как-то нехорошо получается.
Записан

ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #18 : Июля 14, 2009, 01:46:39 am »

ed1k, ты наверное не проснулся Smiley

Не путай uint8_t и unsigned char. unsigned char может быть любого размера, а uint8_t всего 8 бит и ни битом меньше или больше, для плавающего размера есть _least_. Ещё раз, прочти стандарт, Appendix F.2, касательно float, чтобы не говорить про does not really care about representation of floating types.

Кошмар, никто даже стандарт не открывал ... Smiley

Цитата: Annex F
This annex specifies C language support for the IEC 60559 floating-point standard. The
IEC 60559 floating-point standard is specifically Binary floating-point arithmetic for
microprocessor systems, second edition (IEC 60559:1989), previously designated
IEC 559:1989 and as IEEE Standard for Binary Floating-Point Arithmetic
(ANSI/IEEE 754−1985). IEEE Standard for Radix-Independent Floating-Point
Arithmetic (ANSI/IEEE 854−1987) generalizes the binary standard to remove
dependencies on radix and word length. IEC 60559 generally refers to the floating-point
standard, as in IEC 60559 operation, IEC 60559 format, etc. An implementation that
defines _ _STDC_IEC_559_ _ shall conform to the specifications in this annex.
It must be obvious that if _ _STDC_IEC_559_ _ is not defined an implementation shall not conform to the IEC 60559 specification. However it doesn't mean an implementation may not support any different floating types.

Leave alone uint8_t - exact-width integer types are optional and thus they are not available on each and every platform. Nonetheless if they are available, they must not be presented exactly same. For uint16_t and wider it will be endiannes, as was pointed above by Andrey C standard does not care BE or LE, howevereven uint8_t might be presented differently in some rare cases.

P.S. Из дома решил по русски написать и кое-что подправить по мелочи... Как-то я думаю, для цели опросника при приеме - очень хорошо и достаточно, если человек покажет, что он знает о различных компьютерных системах, т.е. что int на BE будет представлен по другому, чем на LE платформе, хотя бы. Я когда-то давно программировал 10 битную систему, мне это сильно помогло при таких вот вопросах на собеседованиях... Для себя нашел сегодня полезное, заглянув в стандарт в очередной раз, что exact-width типы опциональны - по заголовку который мы получаем от третьей фирмы, которая пишет нам компилятор, следовало, что на системе с не кратной 8ми битам шиной данных, uint8_t должен быть как uint8_least_t, т.е. шире, но 8 бит гарантировано (так они тайпдефы написали, указав в коментарии, что это С99 требует). Сегодня узнал, что это не требование стандарта, а видимо пожелания клиентов, которые чаще используют фиксированную ширину чем least типы. В общем, если компьютерная платформа создается в vhdl соседним тимом, то представление данных может быть самым кучерявым, причем С от этого не перестает быть С, даже если пишется под такой спецвычислитель. А стандарт этот я устал читать за последний год - это единственный аргумент в разговорах с третьей фирмой.

« Последнее редактирование: Июля 14, 2009, 04:29:43 am от ed1k » Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #19 : Июля 14, 2009, 07:52:38 am »

P.S. Из дома решил по русски написать и кое-что подправить по мелочи... Как-то я думаю, для цели опросника при приеме - очень хорошо и достаточно, если человек покажет, что он знает о различных компьютерных системах, т.е. что int на BE будет представлен по другому, чем на LE платформе, хотя бы. Я когда-то давно программировал 10 битную систему, мне это сильно помогло при таких вот вопросах на собеседованиях... Для себя нашел сегодня полезное, заглянув в стандарт в очередной раз, что exact-width типы опциональны - по заголовку который мы получаем от третьей фирмы, которая пишет нам компилятор, следовало, что на системе с не кратной 8ми битам шиной данных, uint8_t должен быть как uint8_least_t, т.е. шире, но 8 бит гарантировано (так они тайпдефы написали, указав в коментарии, что это С99 требует). Сегодня узнал, что это не требование стандарта, а видимо пожелания клиентов, которые чаще используют фиксированную ширину чем least типы. В общем, если компьютерная платформа создается в vhdl соседним тимом, то представление данных может быть самым кучерявым, причем С от этого не перестает быть С, даже если пишется под такой спецвычислитель. А стандарт этот я устал читать за последний год - это единственный аргумент в разговорах с третьей фирмой.

Это требование исходит от всяких мелких процессоров (DSP процессоров), у которых один тип данных - фиксированное количество бит (в моём случае было 32), где все типы имеют один и тот же размер: char, short, int. По поводу клиентов, использующих exact типы чаще, стандарт говорит об этом ясно, если на этой платформе есть возможность делать типы разных размеров, то они _обязаны_ быть. На том DSP процессоре, к примеру, я не смогу нормально реализовать вывод графики, но она там просто невозможна физически, по-этому и не только по-этому платформа имеет право на жизнь, она ограничена функционально.

60559 стандарт большой и охватывает тучу вещей и та цитата, что ты привёл, применима именно к этим вещам. Касательно float и double стандарт говорит также ясно:

F.2 Types
1 The C floating types match the IEC 60559 formats as follows:
— The float type matches the IEC 60559 single format.
— The double type matches the IEC 60559 double format.
— The long double type matches an IEC 60559 extended format,307) else a
non-IEC 60559 extended format, else the IEC 60559 double format.
Any non-IEC 60559 extended format used for the long double type shall have more
precision than IEC 60559 double and at least the range of IEC 60559 double.308)

Всё. Оно стандартно, если это компилятор именно С, а не С-подобного языка.

По поводу endianess мы сошлись во мнении, что в данном случае оно не играет никакой роли, если мы говорим про типы в С, а не про их представление в памяти.
Записан

ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #20 : Июля 14, 2009, 06:11:46 pm »

Ну ты опять за приложение Ф взялся. Требования к плавающему типу изложены в стандарте(*), а не приложении, сразу после требований к целым. И не обязаны они быть такими, как в приложении Ф описано, но если макро __STDC_IEC_559__ определено, то только в этом случае они обязаны быть такими как тебе хочется. А еще С комитет наверно бы очень огорчился, узнав, что компилятор С для DSP люди называют С-подобным языком, а не именно С. Вывод графики не имеет никакого отношения к С. В стандарте перечислены библиотеки и заголовки, которые относятся к языку и описаны в стандарте.
Edit: (*) Paragraph 5.2.4.2.2 page 23 book 1 ISO/IEC 9899:1999(E) Characteristics of floating types <float.h>.
« Последнее редактирование: Июля 14, 2009, 07:08:49 pm от ed1k » Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #21 : Июля 14, 2009, 08:07:43 pm »

Откуда ты взял, что без __STDC_IEC_559__ типы с плавающей запятой могут быть разными ?
Записан

ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #22 : Июля 14, 2009, 11:47:42 pm »

без __STDC_IEC_559__ типы с плавающей запятой do not have to follow IEC 60559:1989.

Цитировать
5.2.4.2.2 Characteristics of floating types <float.h>
1 The characteristics of floating types are defined in terms of a model that describes a
representation of floating-point numbers and values that provide information about an
implementation’s floating-point arithmetic.16) The following parameters are used to
define the model for each floating-point type:
s sign (±1)
b base or radix of exponent representation (an integer > 1)
e exponent (an integer between a minimum emin and a maximum emax)
p precision (the number of base-b digits in the significand)
fk nonnegative integers less than b (the significand digits)
2 Afloating-point number (x) is defined by the following model:
x = sbe
p
k=1 Σ fkb−k , emin ≤ e ≤ emax
3 In addition to normalized floating-point numbers ( f1 > 0 if x ≠ 0), floating types may be
able to contain other kinds of floating-point numbers, such as subnormal floating-point
numbers (x ≠ 0, e = emin, f1 = 0) and unnormalized floating-point numbers (x ≠ 0,
e > emin, f1 = 0), and values that are not floating-point numbers, such as infinities and
NaNs. A NaN is an encoding signifying Not-a-Number. A quiet NaN propagates
through almost every arithmetic operation without raising a floating-point exception; a
signaling NaN generally raises a floating-point exception when occurring as an
arithmetic operand.17)
4 An implementation may give zero and non-numeric values (such as infinities and NaNs) a
sign or may leave them unsigned. Wherever such values are unsigned, any requirement
in this International Standard to retrieve the sign shall produce an unspecified sign, and
any requirement to set the sign shall be ignored.
15) See 6.2.5.
16) The floating-point model is intended to clarify the description of each floating-point characteristic and
does not require the floating-point arithmetic of the implementation to be identical.
17) IEC 60559:1989 specifies quiet and signaling NaNs. For implementations that do not support
IEC 60559:1989
, the terms quiet NaN and signaling NaN are intended to apply to encodings with
similar behavior.
Bold font in quote above emphasizes that may be an implementation that does not support IEC 60559:1989.
Цитировать
F.1 Introduction
1 This annex specifies C language support for the IEC 60559 floating-point standard. The
IEC 60559 floating-point standard is specifically Binary floating-point arithmetic for
microprocessor systems, second edition (IEC 60559:1989), previously designated
IEC 559:1989 and as IEEE Standard for Binary Floating-Point Arithmetic
(ANSI/IEEE 754−1985). IEEE Standard for Radix-Independent Floating-Point
Arithmetic (ANSI/IEEE 854−1987) generalizes the binary standard to remove
dependencies on radix and word length. IEC 60559 generally refers to the floating-point
standard, as in IEC 60559 operation, IEC 60559 format, etc. An implementation that
defines _ _STDC_IEC_559_ _ shall conform to the specifications in this annex.

Bold text in quote above says that you can stop reading here (before para F.2 that you so love). In case implementation does not support IEC 60559:1989 this annex F is not applicable.

Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #23 : Июля 15, 2009, 10:00:42 am »

Я тебе про формат говорю, а не про behavior при работе с плавающей запятой.

Ты мне покажи, где binary representation формата может отличаться.
Записан

ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #24 : Июля 15, 2009, 04:27:19 pm »

И я тебе про формат говорю. Открой стандарт, прочитай главы 5 и 6, только не кусками и по диагонали, а от начала и до конца. В главе 6 описаны форматы и их реперезентация - типов с плавающей точкой там нет, потому как стандарт их не нормирует. Печатное официальное издание немного отличается от драфта, из которого я тебе цитаты дергаю, но идея не изменилась. В бумажном как и с INT_MAX, описаны требования к FLT_XXX определениям, в драфте я этого не вижу. И приложение F по-моему вполне конкретно указывает во введении, последнии два предложения, что имплементация, которая заявила о поддержке IEC 60559 должна следовать этому приложению F, если поддержка IEC 60559 не заявлена, то и все сказанное в этом приложении к делу не относится. Я не знаю как еще можно понимать то, что вполне ясно черным по белому написано. Поэтому, если ты считаешь, что язык С требует все данные с плавающей точкой быть представленными в формате оговоренном IEC 60559, я тебя переубеждать не буду. Но недалее как пару лет назад я работал на системе с не IEC60559 данными (sizeof(float) отличался в два раза), которые очень быстро и с повышенной точностью молотились встроенным FPU, с гну-с кажется от виндривер, и были функции экспорта и импорта в/c IEC60599 формата (на случай, если другой процессор по VME шине данных с плавающей точкой в память наскладывает, ну или в другую сторону, надо данные отдать).
Кстати, шкурный вопрос, а что дает такое знание? Надеюсь, ты не требуешь писать в коде 4 вместо sizeof(float), чтобы быстрее исполнялось.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #25 : Июля 15, 2009, 04:38:06 pm »

Конечно они в С стандарте не описаны. Почитай appendix F.2 и IEEE754 или IEC60559, в котором и описываются форматы с плавающей запятой Smiley

Цитировать
стати, шкурный вопрос, а что дает такое знание? Надеюсь, ты не требуешь писать в коде 4 вместо sizeof(float), чтобы быстрее исполнялось.

Абсолютное знание, которое бесполезно само по себе. Я уже писал в этом треде про это, просто справедливости ради. Конечно нужно писать sizeof(float), мало ли встречается вещей.

Что за система с 8 байтовым float, какой процессор ? Просто глупое решение по своей сути делать float 8 байтовым, имея для таких вещей long double для чисел с повышенной точностью, но не ниже double, произвольного формата.

IEEE754, который взят за базу в IEC60559, очень многие производители железа не любят, тем не менее он есть в PowerPC, ARM, и не от хорошей жизни они это делают. Другие форматы хранения гораздо более эффективны для машинного процессинга...
Записан

ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #26 : Июля 15, 2009, 05:56:31 pm »

Конечно они в С стандарте не описаны. Почитай appendix F.2 и IEEE754 или IEC60559, в котором и описываются форматы с плавающей запятой Smiley
Он annex F называется, и еще раз - нет смысла читать F.2, если в F.1 говорят, что если имплементация не поддерживает IEC60559/IEEE754, то все изложеное в этом annex не обязано выполняться. Т.е. весь этот annex справедлив для имплементаций которые заявили что поддерживают плавающую точку и именно по стандарту IEC60559/IEEE754.

Что за система с 8 байтовым float, какой процессор ? Просто глупое решение по своей сути делать float 8 байтовым, имея для таких вещей long double для чисел с повышенной точностью, но не ниже double, произвольного формата.
IEEE754, который взят за базу в IEC60559, очень многие производители железа не любят, тем не менее он есть в PowerPC, ARM, и не от хорошей жизни они это делают. Другие форматы хранения гораздо более эффективны для машинного процессинга...
Архитектура CPU была PowerPC, возможно они что-то упростили, возможно использовали другой формат. Я не вникал.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #27 : Июля 16, 2009, 08:33:50 am »

Может ты и прав, но уж очень неявно всё прописано. Я понимаю это как, если поддерживается полный subset IEC60559, то объявляется тот дефайн, если не полностью, то он не объявляется. Далее идёт задание форматов с плавающей запятой и читать его на мой взгляд даже если первый пункт не выполняется всё равно нужно. Иначе это может полностью разнести вдребезги всю поддержку операций с плавающей запятой.

Вот у меня есть интересная табличка с поддержкой IEEE754.

Код:
        IEEE 754:       Intel x86, and all RISC systems (IBM Power
                        and PowerPC, Compaq/DEC Alpha, HP PA-RISC,
                        Motorola 68xxx and 88xxx, SGI (MIPS) R-xxxx,
                        Sun SPARC, and others);

        VAX:            Compaq/DEC

        IBM S/390:      IBM (however, in 1998, IBM added an IEEE 754
                        option to S/390; see below)

        Cray:           X-MP, Y-MP, C-90; other Cray models have been
                        based on Alpha and SPARC processors with
                        IEEE-754 arithmetic.

However, there are many issues of how strict IEEE 754 compliance is.

Some vendors implement the standard entirely in hardware (IBM and Intel), others in a combination of hardware and software (all non-IBM RISC systems), and at least one entirely in software (Apple SANE (Standard Apple Numeric Environment) on older Macintoshes).

Compaq/DEC Alpha by default does not adhere to IEEE 754 requirements: overflow and invalid operands (NaNs) terminate the job. Compiler options can be given to choose IEEE 754 conformance, but there is then a significant run-time penalty because of the need to insert trap barrier instructions that flush the instruction pipeline, so that trapping instructions can be precisely identified, and the exception handled in software. The latest Alpha chip, the 21264, provides full hardware support for IEEE 754 (see \cite{Kessler:1999:AM} below).

Даже исходя из здравого смысла, не будет пачка производителей процессоров так прогибаться, чтобы делать поддержку всем ненависного формата.

http://www.mscs.mu.edu/~georgec/IFAQ/casares1.html
Записан

ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #28 : Июля 16, 2009, 11:02:38 pm »

Может ты и прав, но уж очень неявно всё прописано. Я понимаю это как, если поддерживается полный subset IEC60559, то объявляется тот дефайн, если не полностью, то он не объявляется.
Браво! Именно так это и следует понимать. Если дефайн обьявлен - то все F.х пункты должны соблюдаться. Если дефайна нету, то любой из F.х пунктов может не выполняться, включая F.2. Я не одинок в своем понимании. Гугль еще целую толпу ссылок выдает такого же содержания. Так что я еще не обезумел.
Цитата:  C primer plus By Stephen Prata
Цитата: Write portable code By Brian Hook

Далее идёт задание форматов с плавающей запятой и читать его на мой взгляд даже если первый пункт не выполняется всё равно нужно. Иначе это может полностью разнести вдребезги всю поддержку операций с плавающей запятой.

Вот у меня есть интересная табличка с поддержкой IEEE754.

Код:
        IEEE 754:       Intel x86, and all RISC systems (IBM Power
                        and PowerPC, Compaq/DEC Alpha, HP PA-RISC,
                        Motorola 68xxx and 88xxx, SGI (MIPS) R-xxxx,
                        Sun SPARC, and others);

        VAX:            Compaq/DEC

        IBM S/390:      IBM (however, in 1998, IBM added an IEEE 754
                        option to S/390; see below)

        Cray:           X-MP, Y-MP, C-90; other Cray models have been
                        based on Alpha and SPARC processors with
                        IEEE-754 arithmetic.

However, there are many issues of how strict IEEE 754 compliance is.

Some vendors implement the standard entirely in hardware (IBM and Intel), others in a combination of hardware and software (all non-IBM RISC systems), and at least one entirely in software (Apple SANE (Standard Apple Numeric Environment) on older Macintoshes).

Compaq/DEC Alpha by default does not adhere to IEEE 754 requirements: overflow and invalid operands (NaNs) terminate the job. Compiler options can be given to choose IEEE 754 conformance, but there is then a significant run-time penalty because of the need to insert trap barrier instructions that flush the instruction pipeline, so that trapping instructions can be precisely identified, and the exception handled in software. The latest Alpha chip, the 21264, provides full hardware support for IEEE 754 (see \cite{Kessler:1999:AM} below).

Даже исходя из здравого смысла, не будет пачка производителей процессоров так прогибаться, чтобы делать поддержку всем ненависного формата.

http://www.mscs.mu.edu/~georgec/IFAQ/casares1.html


Прикол в том, что пока поддержка IEEE 754 стандарта заявлена опционально, все может разнестись в дребезги. Кому что нравится - это не важно. С99 на сегодня не требует (т.е. требует опционально) какого либо определенного формата типов с плавающей точкой. Поэтому, заложившись на определенный стандарт этих типов можно попасть впросак.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #29 : Июля 17, 2009, 09:20:38 am »

Цитировать
Браво! Именно так это и следует понимать. Если дефайн обьявлен - то все F.х пункты должны соблюдаться. Если дефайна нету, то любой из F.х пунктов может не выполняться, включая F.2. Я не одинок в своем понимании. Гугль еще целую толпу ссылок выдает такого же содержания. Так что я еще не обезумел.

И

Цитировать
However, it could be that an implementation doesn't meet all the requirements of IEC 60559; for example, the underlying hardware may not be up to the task.

Я как раз ту цитату с ссылкой привёл не зря, там написано, насколько IEEE754 реализация различается на платформах, но только по поведению, не по формату. Я всё таки продолжаю читать C99 F.2 как must, ибо другого не написано.

__STDC_IEC_559__ по умолчанию не объявлен в gcc как pre-defined макрос, а вынесен на уровень features платформ, так что я не знаю, что ты проверял на своей PowerPC платформе. В MSVC 2003, 2005, 2008 оно тоже не объявлено по одной простой причине, стандарт C позволяет (в отличии от Java) использовать: 1) промежуточное хранение данных с повышенной точностью, что есть практически во всех процессорах, 2) спаренные операции, такие как multiply-add, 3) реализацию аппаратно только одного типа для работы c floating point, и последующую конвертацию в другие типы уже при работе с переменными данных неподдерживаемых типов. Голый 60559 этого не позволяет, потому что он описывает и все операции и поведение при различных операциях.

Все annex'ы помечаны как informative, Annex D и F помечены как normative.
Записан

Страниц: 1 [2] 3
  Печать  
 
Перейти в: