QNX.ORG.RU

Общее => Общение => Тема начата: lestat от Июля 13, 2009, 04:00:07 pm



Название: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 13, 2009, 04:00:07 pm
Есть такой вопрос: Какие из фундаментальных типов С являются архитектурно-независимыми и имеют одинаковое представление на всех платформах?

1. int
2. unsigned int
3. float
4. double
5. long
6. unsigned long
7. Никакие из перечисленных

Как бы вы ответили на этот вопрос ?

P.S. Вопрос взят с www.quizful.net из теста начального уровня по С. Я подбирал вопросы для того чтобы можно было потестировать скиллзы студентов, меня собственно, задел именно этот вопрос.


Название: Re: Платформенно-зависимые типы в C
Отправлено: AG от Июля 13, 2009, 04:17:02 pm
7. ибо платформеннонезавимых типов в списке нет >> uint32_t и компания.

>> С являются архитектурно-независимыми и имеют одинаковое представление на всех платформах?
Это вообще класс! А если их в память записать? А как же маленькие и большие индейцы? Вообще вопрос какой-то некорректный или не полный что ли...


Название: Re: Платформенно-зависимые типы в C
Отправлено: A_O от Июля 13, 2009, 04:25:37 pm
Ничего не понял.
Там сказано, что правильный ответ - 7.
У меня возражений нет.
Или первоначально там было что-то другое, и уже поправлено?


Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 13, 2009, 04:28:18 pm
Угу, я пытался им доказать, что вопрос некорректен (как раз из-за записи, либо считывания их из памяти фрагментарно, не как доступ к целому типу, ибо стандарт такой доступ не оговаривает). Второе float и double таки стандартизованы и всегда имеют одинаковый формат, как последовательность битов.


Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 13, 2009, 04:28:59 pm
Ничего не понял.
Там сказано, что правильный ответ - 7.
У меня возражений нет.
Или первоначально там было что-то другое, и уже поправлено?
Да нет, как раз я считаю, что 7 - это неправильно в контексте данного вопроса.


Название: Re: Платформенно-зависимые типы в C
Отправлено: AG от Июля 13, 2009, 05:21:11 pm
Второе float и double таки стандартизованы и всегда имеют одинаковый формат, как последовательность битов.

Тут ты не совсем прав.... при наличии опций типа -m96bit-long-double и -m128bit-long-double говорить о стандартизации даблов не совсем корректно. С другой стороны, те же float и double в CUDA (на самом железе NVIDIA) могут отличаться от представления в C++.


Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 13, 2009, 05:26:26 pm
Не я прав :) Я про long 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)

long double - это тёмная лошадка ...


Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 13, 2009, 05:31:05 pm
All compute-capable NVIDIA GPUs support 32-bit integer and single precision floating point arithmetic. They follow the IEEE-754 standard for single-precision binary floating-point arithmetic, with some minor differences - notably that denormalized numbers are not supported.

Т.е. для CUDA необходимо все числа приводить в диапазон -1.0...+1.0 +/- Exponent, тем не менее они тоже стандартны, иначе не было бы интеграции с C.


Название: Re: Платформенно-зависимые типы в C
Отправлено: AG от Июля 13, 2009, 05:50:51 pm
Т.е. для CUDA необходимо все числа приводить в диапазон -1.0...+1.0 +/- Exponent, ...
... являются архитектурно-независимыми и имеют одинаковое представление на всех платформах?

Соответствует? ИМХО нет...


Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 13, 2009, 05:51:55 pm
Это CUDA не соответствуют стандарту С :) Не более того.


Название: Re: Платформенно-зависимые типы в C
Отправлено: AG от Июля 13, 2009, 06:11:57 pm
Это CUDA не соответствуют стандарту С :) Не более того.

В какой-то степени это C для GPGPU. Так что...
У интелов, на сколько мне помнится, вообще 10-байтный дабл используется для вычислений внутри FPU, так что результат не будет идентичным на разных платформах (отличных от x86)...
О полной переносимости речи быть не может. Ну и конечно же приколы с LE и BE...
Так что 7! И ни каких других вариантов.


Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 13, 2009, 08:03:36 pm
Это CUDA не соответствуют стандарту С :) Не более того.
В какой-то степени это C для GPGPU. Так что...

У C не бывает степеней, оно либо удовлетворяет стандарту, либо нет. CUDA - это C-подобный язык.

У интелов, на сколько мне помнится, вообще 10-байтный дабл используется для вычислений внутри FPU, так что результат не будет идентичным на разных платформах (отличных от x86)...

Ты путаешь с long double.

О полной переносимости речи быть не может. Ну и конечно же приколы с LE и BE...
Тогда вопрос задан неверно, нужно было спрашивать про представление типов в памяти, а не просто представление типов, которые стандарт чётко расписывает.


Название: Re: Платформенно-зависимые типы в C
Отправлено: ed1k от Июля 13, 2009, 08:15:24 pm
The right answer is 7. C standard does not really care about representation of integer or floating types; that's why there are limits.h, float.h and stdint.h mentioned in standard (ISO/IEC9899:1999(E)). That's all implementation specific and standard gives only minimal requirements by defining INT_MIN, UINT_MAX and this sort of macros which must be defined by implementation but should not be worse than those listed in standard. uint8_t is similar on most platforms (except those that can't access 8 bits at a time and work with words only) but it's not listed in 1-6; moreover if we talkinf about the broad range of platforms where C program may be compiled and run, even uint8_t may be represented differently. The order of bits forming very basic integer may be different in the real world.





Название: Re: Платформенно-зависимые типы в C
Отправлено: A_O от Июля 13, 2009, 09:28:34 pm
Тогда вопрос задан неверно, нужно было спрашивать про представление типов в памяти, а не просто представление типов, которые стандарт чётко расписывает.
А что такое "просто представление типов"?


Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 13, 2009, 09:30:44 pm
ed1k, ты наверное не проснулся :)

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

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


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


Название: Re: Платформенно-зависимые типы в C
Отправлено: bbceler от Июля 13, 2009, 09:57:29 pm
ed1k, ты наверное не проснулся :)
Кошмар, никто даже стандарт не открывал ... :)
lestat я вижу что мир одинаковый. У нас тоже никому не хочеться смотреть ....
А мне кажеться что все таки в целом вопрос слишком роздулся.
Для начяльного изучения языка С ответ 7 вполни достоточень.


Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 13, 2009, 10:05:35 pm
lestat
Для начяльного изучения языка С ответ 7 вполни достоточень.
Может ты и прав, нужно в себе давить чувство торжествующей справедливости :) Но всё равно как-то нехорошо получается.


Название: Re: Платформенно-зависимые типы в C
Отправлено: ed1k от Июля 14, 2009, 01:46:39 am
ed1k, ты наверное не проснулся :)

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

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

Цитата: 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 соседним тимом, то представление данных может быть самым кучерявым, причем С от этого не перестает быть С, даже если пишется под такой спецвычислитель. А стандарт этот я устал читать за последний год - это единственный аргумент в разговорах с третьей фирмой.



Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 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 мы сошлись во мнении, что в данном случае оно не играет никакой роли, если мы говорим про типы в С, а не про их представление в памяти.


Название: Re: Платформенно-зависимые типы в C
Отправлено: ed1k от Июля 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>.


Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 14, 2009, 08:07:43 pm
Откуда ты взял, что без __STDC_IEC_559__ типы с плавающей запятой могут быть разными ?


Название: Re: Платформенно-зависимые типы в C
Отправлено: ed1k от Июля 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.



Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 15, 2009, 10:00:42 am
Я тебе про формат говорю, а не про behavior при работе с плавающей запятой.

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


Название: Re: Платформенно-зависимые типы в C
Отправлено: ed1k от Июля 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), чтобы быстрее исполнялось.


Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 15, 2009, 04:38:06 pm
Конечно они в С стандарте не описаны. Почитай appendix F.2 и IEEE754 или IEC60559, в котором и описываются форматы с плавающей запятой :)

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

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

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

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


Название: Re: Платформенно-зависимые типы в C
Отправлено: ed1k от Июля 15, 2009, 05:56:31 pm
Конечно они в С стандарте не описаны. Почитай appendix F.2 и IEEE754 или IEC60559, в котором и описываются форматы с плавающей запятой :)
Он 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, возможно они что-то упростили, возможно использовали другой формат. Я не вникал.


Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 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


Название: Re: Платформенно-зависимые типы в C
Отправлено: ed1k от Июля 16, 2009, 11:02:38 pm
Может ты и прав, но уж очень неявно всё прописано. Я понимаю это как, если поддерживается полный subset IEC60559, то объявляется тот дефайн, если не полностью, то он не объявляется.
Браво! Именно так это и следует понимать. Если дефайн обьявлен - то все F.х пункты должны соблюдаться. Если дефайна нету, то любой из F.х пунктов может не выполняться, включая F.2. Я не одинок в своем понимании. Гугль еще целую толпу ссылок выдает такого же содержания. Так что я еще не обезумел.
Цитата:  C primer plus By Stephen Prata

The IEC Floating-Point Standard
The International Electotechnical Committee (IEC) has published a standard for floating-point calculations (IEC 60559). The standard includes discussion of floating-point formats, precision, NaNs, infinities, rounding practices, conversions, exceptions, recommended functions and algorithms, and so on. C99 accepts this standard as a guide to the C implementation of floating-point calculations. Most of the C99 additions to floating-point facilities are part of this effort, such as the fenv.h header file and several of the new math functions.

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.
 (http://my.safaribooksonline.com/0672326965/app02lev1sec8)
Цитата: Write portable code By Brian Hook

...starting with C++98 and C99, optional support for IEEE 754 has been added...
 (http://books.google.com/books?id=4VOKcEAPPO0C&dq=Write+portable+code+hook&printsec=frontcover&source=bn&hl=en&ei=Hm1fSv2EEpG3lAfIldCQDQ&sa=X&oi=book_result&ct=result&resnum=7)

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

Вот у меня есть интересная табличка с поддержкой 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 на сегодня не требует (т.е. требует опционально) какого либо определенного формата типов с плавающей точкой. Поэтому, заложившись на определенный стандарт этих типов можно попасть впросак.


Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 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.


Название: Re: Платформенно-зависимые типы в C
Отправлено: ed1k от Июля 17, 2009, 05:48:22 pm
MSVC ни разу не С99 compliant компилятор. Это самый убогий компилятор, который мы ныне поддерживаем.

Ну как я уже писал, каждый вправе думать то, что считает правильным, но правда всегда одна. Просто стандарт С99 говорит о том, что поддержка IEC 60559 опциональна, т.е. может быть, а может и не быть. Приложение помечено как normative, потому как если компилятор заявил, что он поддерживает IEC 60559 (путем обьявления макро), то шаг в сторону не допустим - все пункты должны выполняться.



Название: Re: Платформенно-зависимые типы в C
Отправлено: lestat от Июля 17, 2009, 05:57:21 pm
На сколько я знаю нет ни одного С99 compliant компилятора :) А по поводу MSVC, мой бывший шеф когда нанимает линуксоидов, то заставляет их писать тестовые задания под Win32 на MSVC Express. А виндовозников на убунте/gcc :) Говорит, что те, кто даже не пикают от такого - настоящие профи, которые неподвержены различным фобиям и филиям.

А мне нравится MSVC, чтобы я не писал, я всегда проверяю потом код под MSVC, оно такие warning'и умудряется выдавать, что никогда не подумаешь, что в этом месте может быть проблема.


Название: Re: Платформенно-зависимые типы в C
Отправлено: LP006688 от Июля 21, 2009, 05:31:08 pm
До сих пор не существует более надежной среды разработки чем от Microsoft. Это результат 24 летнего опыта.


Название: Re: Платформенно-зависимые типы в C
Отправлено: da-nie от Октября 11, 2018, 07:19:35 pm
Кстати, очень спорный сайт www.quizful.net. К примеру, приведена программа и предложено определить результат вычитания двух указателей. Про 32 битную плоскую модель памяти в тексте задачи нет ни слова. Один из вариантов "Это бессмысленно". Вот только верным считается не этот вариант (а размер массива, как результат), хотя давным-давно на том же хабре подробно разобрали, почему нельзя определять размер массива вычитанием указателей.
Ну и куча тестов на простую внимательность (пропустили в комментарии */ звёздочку - попробуй с первого раза заметь :) ). Ещё мне встретился массив неопределённой длины в структуре, который вообще-то, помнится, совсем не стандартны и просто фишка ряда компиляторов.