Арифметика long double
От: LaptevVV Россия  
Дата: 12.01.24 06:26
Оценка:
Как реализована арифметика c long double в gcc ?
Размер пишет 16 байт, но в интел такого аппаратного размера нет.
Или в современных уже есть ?
Регистры сопроцессора были по 80 бит.
Но последняя версия стандарта ieee-754 включает 128-битные дробные
Кто знает, оно уже в аппаратуре есть или нет ?

Версия gcc jn 8.1 до 11.0
С++17 по любому есть (хотя в 8.1 не совсем полный).

Обнаружил стандарт: https://en.wikipedia.org/wiki/IEEE_754
Там даже 256-битные есть.
Но насколько они реализованы в железе ?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Отредактировано 12.01.2024 6:46 LaptevVV . Предыдущая версия .
Re: Арифметика long double
От: andrey.desman  
Дата: 12.01.24 06:57
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Как реализована арифметика c long double в gcc ?

LVV>Размер пишет 16 байт, но в интел такого аппаратного размера нет.

Выравнивание.
Re[2]: Арифметика long double
От: LaptevVV Россия  
Дата: 12.01.24 07:10
Оценка:
LVV>>Как реализована арифметика c long double в gcc ?
LVV>>Размер пишет 16 байт, но в интел такого аппаратного размера нет.
AD>Выравнивание.
И что ?
Еще в i386 проблема выравнивания как-то была сильно сглажена.
И вообще-то размер параграфа был еще в 16-битной адресации равен 16 байтам.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Арифметика long double
От: andrey.desman  
Дата: 12.01.24 07:12
Оценка:
Здравствуйте, LaptevVV, Вы писали:

AD>>Выравнивание.

LVV>И что ?

Что и что? long double занимает 16 байт, из них используется 10.

LVV>Еще в i386 проблема выравнивания как-то была сильно сглажена.

LVV>И вообще-то размер параграфа был еще в 16-битной адресации равен 16 байтам.

Чо?
Отредактировано 12.01.2024 7:13 andrey.desman . Предыдущая версия .
Re: Арифметика long double
От: Pavel Dvorkin Россия  
Дата: 12.01.24 07:13
Оценка: +2
Здравствуйте, LaptevVV, Вы писали:

LVV>Как реализована арифметика c long double в gcc ?


Написать программу из 3 строчек, откомпилировать в режиме создания ассемблерного текста и посмотреть ?
With best regards
Pavel Dvorkin
Re[4]: Арифметика long double
От: LaptevVV Россия  
Дата: 12.01.24 07:27
Оценка: +1
AD>>>Выравнивание.
LVV>>И что ?
AD>Что и что? long double занимает 16 байт, из них используется 10.
1. Это я и хотел услышать
Но выравнивание здесь причем ?
Тут происходит усечение мантиссы.
LVV>>Еще в i386 проблема выравнивания как-то была сильно сглажена.
LVV>>И вообще-то размер параграфа был еще в 16-битной адресации равен 16 байтам.
AD>Чо?
Это к 1 строке или к последней.
Если к последней, то параграф — это 16 байт.
Сегментный регистр, когда участвовал в вычислении адреса, сдвигался на 4 бита влево (становился 20 бит) и таким образом выравнивался на границу параграфа.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Арифметика long double
От: LaptevVV Россия  
Дата: 12.01.24 07:30
Оценка:
LVV>>Как реализована арифметика c long double в gcc ?
PD>Написать программу из 3 строчек, откомпилировать в режиме создания ассемблерного текста и посмотреть ?
Да, спасибо. Чего-то в голову как-то не пришло — редко до до ассемблера спускаться приходится.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Арифметика long double
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 12.01.24 07:34
Оценка: +2
Здравствуйте, LaptevVV, Вы писали:

LVV>Как реализована арифметика c long double в gcc ?

LVV>Размер пишет 16 байт, но в интел такого аппаратного размера нет.
LVV>Или в современных уже есть ?

В документации, как в той Греции, есть всё:

'-m96bit-long-double'
'-m128bit-long-double'
These switches control the size of 'long double' type. The x86-32
application binary interface specifies the size to be 96 bits, so
'-m96bit-long-double' is the default in 32-bit mode.

Modern architectures (Pentium and newer) prefer 'long double' to be
aligned to an 8- or 16-byte boundary. In arrays or structures
conforming to the ABI, this is not possible. So specifying
'-m128bit-long-double' aligns 'long double' to a 16-byte boundary
by padding the 'long double' with an additional 32-bit zero.

In the x86-64 compiler, '-m128bit-long-double' is the default
choice as its ABI specifies that 'long double' is aligned on
16-byte boundary.

Notice that neither of these options enable any extra precision
over the x87 standard of 80 bits for a 'long double'.

https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gcc/x86-Options.html

LVV>Регистры сопроцессора были по 80 бит.

LVV>Но последняя версия стандарта ieee-754 включает 128-битные дробные
LVV>Кто знает, оно уже в аппаратуре есть или нет ?

Не-а.

LVV>Обнаружил стандарт: https://en.wikipedia.org/wiki/IEEE_754

LVV>Там даже 256-битные есть.

В стандарте есть рекомендации на формат для любого размера числа, кратного 32 битам. Но 256 там явно не выделяется — это инициатива "на местах" от авторов википедии.

LVV>Но насколько они реализованы в железе ?


Ни насколько.
The God is real, unless declared integer.
Re[5]: Арифметика long double
От: andrey.desman  
Дата: 12.01.24 07:37
Оценка: +1
Здравствуйте, LaptevVV, Вы писали:

AD>>Что и что? long double занимает 16 байт, из них используется 10.

LVV>1. Это я и хотел услышать
LVV>Но выравнивание здесь причем ?

Чтобы ровно и четко все было, а не эти ваши 10 байт, которые и в массив не положишь.

LVV>Тут происходит усечение мантиссы.


А экспоненты нет? Чтобы что-то усеч, надо чтобы это что-то было. А его не было.

Ты смотришь на это как на то, что раз 16 байт, значит все они под значение использоваться должны. Тогда как по факту поддержали 80 битные числа, а потом добили их до приемлемого выравнивания в 128 бит.
Отредактировано 12.01.2024 7:38 andrey.desman . Предыдущая версия .
Re[2]: Арифметика long double
От: kov_serg Россия  
Дата: 12.01.24 08:21
Оценка:
Здравствуйте, netch80, Вы писали:

LVV>>Но насколько они реализованы в железе ?


N>Ни насколько.

Только если у вас не POWER9 https://www.talospace.com/2018/12/the-saga-of-power-isa-128-bit-long.html

И в intel x64 смешивать использование FPU, SSE и AVX не благославляется. При это 80bit регистры FPU чуть ли не depricated. Прямо большими буквами написано или то или другое иначе пи%&ец.
Re[6]: Арифметика long double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 12.01.24 13:36
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>Ты смотришь на это как на то, что раз 16 байт, значит все они под значение использоваться должны. Тогда как по факту поддержали 80 битные числа, а потом добили их до приемлемого выравнивания в 128 бит.


Получается, из двоичного файла я не смогу прочитать long double в gcc простым memcpy sizeof(long double)?
Маньяк Робокряк колесит по городу
Re[7]: Арифметика long double
От: andrey.desman  
Дата: 12.01.24 13:49
Оценка:
Здравствуйте, Marty, Вы писали:

M>Получается, из двоичного файла я не смогу прочитать long double в gcc простым memcpy sizeof(long double)?


Почему нет? Если сам же и писал.
Re[8]: Арифметика long double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 12.01.24 14:25
Оценка: :)
Здравствуйте, andrey.desman, Вы писали:

M>>Получается, из двоичного файла я не смогу прочитать long double в gcc простым memcpy sizeof(long double)?


AD>Почему нет? Если сам же и писал.


Ну, то есть, конечно можно, но тогда уже использовать sizeof(long double) не получится, надо магическую константу 10 использовать. И, видимо, структуру, где есть long double, одним махом не считать.

Когда сам писал, то всё просто, но двоичные форматы обычно даются нам свыше
Маньяк Робокряк колесит по городу
Re[9]: Арифметика long double
От: andrey.desman  
Дата: 12.01.24 14:29
Оценка:
Здравствуйте, Marty, Вы писали:

M>Ну, то есть, конечно можно, но тогда уже использовать sizeof(long double) не получится, надо магическую константу 10 использовать. И, видимо, структуру, где есть long double, одним махом не считать.


Почему? Что там в паддинге пофиг вообще. Как читать зависит исключительно от формата, 10 там байт или 16.
Re[9]: Арифметика long double
От: flаt  
Дата: 12.01.24 14:38
Оценка:
Здравствуйте, Marty, Вы писали:

M>Ну, то есть, конечно можно, но тогда уже использовать sizeof(long double) не получится, надо магическую константу 10 использовать. И, видимо, структуру, где есть long double, одним махом не считать.


Всё же проще записывать и считывать по 16 байт — особенно, если это массив, а не единичное значение. То, что из них значащих 80 бит — никак не помешает (если не заморачиваться упаковкой по размеру).

А вот разбивать массив long double на 10-байтные отрезки и сериализовать это — геморрой на ровном месте без практической пользы.
Re[10]: Арифметика long double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 12.01.24 14:54
Оценка:
Здравствуйте, andrey.desman, Вы писали:

M>>Ну, то есть, конечно можно, но тогда уже использовать sizeof(long double) не получится, надо магическую константу 10 использовать. И, видимо, структуру, где есть long double, одним махом не считать.


AD>Почему? Что там в паддинге пофиг вообще. Как читать зависит исключительно от формата, 10 там байт или 16.


Не понял. Записали компилятором, у которого нет паддинга. Читаем компилятором с паддингом. Как я понимаю, какие опции pragma pack не используй, а в структуре это поле всегда 16 байт будет. Итого — структуру целиком не прочитать, только поля по отдельности. Ну и когда по отдельности long double читаешь, нельзя использовать sizeof(long double), а надо константу 10 использовать
Маньяк Робокряк колесит по городу
Re[10]: Арифметика long double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 12.01.24 14:56
Оценка:
Здравствуйте, flаt, Вы писали:

F>Всё же проще записывать и считывать по 16 байт — особенно, если это массив, а не единичное значение. То, что из них значащих 80 бит — никак не помешает (если не заморачиваться упаковкой по размеру).


F>А вот разбивать массив long double на 10-байтные отрезки и сериализовать это — геморрой на ровном месте без практической пользы.


В памяти — безусловно, там размер пофигу. А при обмене двоичными данными — по другому никак не получится, другие компиляторы имеют свой размер long double
Маньяк Робокряк колесит по городу
Re[11]: Арифметика long double
От: andrey.desman  
Дата: 12.01.24 17:27
Оценка:
Здравствуйте, Marty, Вы писали:

M>Не понял. Записали компилятором, у которого нет паддинга. Читаем компилятором с паддингом. Как я понимаю, какие опции pragma pack не используй, а в структуре это поле всегда 16 байт будет. Итого — структуру целиком не прочитать, только поля по отдельности. Ну и когда по отдельности long double читаешь, нельзя использовать sizeof(long double), а надо константу 10 использовать


Я б так сериализацию не делал, но если уж так хочется, то union {long double; char padding[16];} stuctMember;
Re[12]: Арифметика long double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 12.01.24 17:39
Оценка:
Здравствуйте, andrey.desman, Вы писали:

M>>Не понял. Записали компилятором, у которого нет паддинга. Читаем компилятором с паддингом. Как я понимаю, какие опции pragma pack не используй, а в структуре это поле всегда 16 байт будет. Итого — структуру целиком не прочитать, только поля по отдельности. Ну и когда по отдельности long double читаешь, нельзя использовать sizeof(long double), а надо константу 10 использовать


AD>Я б так сериализацию не делал, но если уж так хочется, то union {long double; char padding[16];} stuctMember;


И как это решит проблему с данными, которые формирует кто-то другой?
Маньяк Робокряк колесит по городу
Re[13]: Арифметика long double
От: rg45 СССР  
Дата: 12.01.24 17:42
Оценка:
Здравствуйте, Marty, Вы писали:

M>И как это решит проблему с данными, которые формирует кто-то другой?


По-хорошему, и сериализацию, и десериализацию должна выполнять одна и та же софтина, которая и обеспечивает портабельность, версионность, обратную совместимось и пр. (в том объеме, в котором это требуется).
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 12.01.2024 17:48 rg45 . Предыдущая версия . Еще …
Отредактировано 12.01.2024 17:43 rg45 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.