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

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


Написать программу из 3 строчек, откомпилировать в режиме создания ассемблерного текста и посмотреть ?
With best regards
Pavel Dvorkin
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[13]: Арифметика long double
От: andrey.desman  
Дата: 12.01.24 17:50
Оценка: +1 :)
Здравствуйте, Marty, Вы писали:


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


Штош. Нахалявить тогда не получится, придется писать честный десериализатор
Re[11]: Арифметика long double
От: _NN_ www.nemerleweb.com
Дата: 12.01.24 19:00
Оценка: +2
Здравствуйте, Marty, Вы писали:

Эта проблема присуща не только long double.
Каждый компилятор даже на одной платформе может использовать разные размеры для примитивных типов.
Например, wchar_t 4 байта в GCC но 2 байта в MSVC.
А может быть, что и long double всего 8 байт в MSVC.
Или ещё упрощенней 32 битный компилятор с размеров указателя 32 бит.

Резьмирая, если вы хотите записать в файл прямо из памяти и также читать, то тут надо хорошо заранее продумать кто будет читать и кто писать.
А лучше всего сериализовать так, чтобы не нужно было думать о таких нюансах.
http://rsdn.nemerleweb.com
http://nemerleweb.com
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[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[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, одним махом не считать.

Когда сам писал, то всё просто, но двоичные форматы обычно даются нам свыше
Маньяк Робокряк колесит по городу
Арифметика 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[2]: Арифметика long double
От: LaptevVV Россия  
Дата: 12.01.24 07:30
Оценка:
LVV>>Как реализована арифметика c long double в gcc ?
PD>Написать программу из 3 строчек, откомпилировать в режиме создания ассемблерного текста и посмотреть ?
Да, спасибо. Чего-то в голову как-то не пришло — редко до до ассемблера спускаться приходится.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
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[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 . Предыдущая версия .
Re: Арифметика long double
От: T4r4sB Россия  
Дата: 12.01.24 17:42
Оценка:
Здравствуйте, LaptevVV, Вы писали:

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

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

Если ты про long double, то не знаю
Если про __float128, то эмуляция, причём в десятки раз медленнее нативных типов
Отредактировано 12.01.2024 17:44 T4r4sB . Предыдущая версия .
Re[12]: Арифметика long double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 12.01.24 21:27
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Эта проблема присуща не только long double.

_NN>Каждый компилятор даже на одной платформе может использовать разные размеры для примитивных типов.
_NN>Например, wchar_t 4 байта в GCC но 2 байта в MSVC.
_NN>А может быть, что и long double всего 8 байт в MSVC.
_NN>Или ещё упрощенней 32 битный компилятор с размеров указателя 32 бит.

Есть всякие std::int/uintXX_t.
wchar обычно в двоичном виде не читают, особенно линуксовый 4х-байтный, там это никто так не хранит
С целыми это всегда можно настроить тайпдефами


_NN>Резьмирая, если вы хотите записать в файл прямо из памяти и также читать, то тут надо хорошо заранее продумать кто будет читать и кто писать.

_NN>А лучше всего сериализовать так, чтобы не нужно было думать о таких нюансах.

Конечно, лучше всего сдялат сразу без ошибок, кто бы спорил
Маньяк Робокряк колесит по городу
Re[13]: Арифметика long double
От: rg45 СССР  
Дата: 12.01.24 21:50
Оценка:
Здравствуйте, Marty, Вы писали:

M>Есть всякие std::int/uintXX_t.


Ну дык, это ж нужно еще не забывать при сериализации/десериализации делать доп. преобразования. Потому как в объектных моделях, помимо этих типов, в полный рост используются всякие int, long, size_t и т.п. У нас на протяжении многих лет, пока поддерживали 32-битные конфигурации (одновременно с 64-битными) это было прямо болячкой. Хоть и знали все об этом, но, как какое-нибудь расширение модели, так обязательно кто-нибудь прощелкает этот момент.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 13.01.2024 8:09 rg45 . Предыдущая версия .
Re[12]: Арифметика long double
От: LaptevVV Россия  
Дата: 13.01.24 06:35
Оценка:
_NN>Каждый компилятор даже на одной платформе может использовать разные размеры для примитивных типов.
_NN>Например, wchar_t 4 байта в GCC но 2 байта в MSVC.
_NN>А может быть, что и long double всего 8 байт в MSVC.
Совершенно верно.
Именно так у них и сделано с незапямятных времен.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[13]: Арифметика long double
От: _NN_ www.nemerleweb.com
Дата: 13.01.24 09:36
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, _NN_, Вы писали:


_NN>>Эта проблема присуща не только long double.

_NN>>Каждый компилятор даже на одной платформе может использовать разные размеры для примитивных типов.
_NN>>Например, wchar_t 4 байта в GCC но 2 байта в MSVC.
_NN>>А может быть, что и long double всего 8 байт в MSVC.
_NN>>Или ещё упрощенней 32 битный компилятор с размеров указателя 32 бит.

M>Есть всякие std::int/uintXX_t.

M>wchar обычно в двоичном виде не читают, особенно линуксовый 4х-байтный, там это никто так не хранит
M>С целыми это всегда можно настроить тайпдефами


_NN>>Резьмирая, если вы хотите записать в файл прямо из памяти и также читать, то тут надо хорошо заранее продумать кто будет читать и кто писать.

_NN>>А лучше всего сериализовать так, чтобы не нужно было думать о таких нюансах.

M>Конечно, лучше всего сдялат сразу без ошибок, кто бы спорил


А что мешает взять простое готовое решение, скажем Protobuf, а не создавать своё полуработающее поделие.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[14]: Арифметика long double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 13.01.24 13:14
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>А что мешает взять простое готовое решение, скажем Protobuf, а не создавать своё полуработающее поделие.


Потому что в 90% случаев данные приходят и уходят от/в сторонный софт
Маньяк Робокряк колесит по городу
Re[11]: Арифметика long double
От: SaZ  
Дата: 14.01.24 15:09
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, andrey.desman, Вы писали:


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


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


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


Следующим открытием для вас будут понятия low endian/big endian. Лучше берите готовый сериализатор.
Re[12]: Арифметика long double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.01.24 16:04
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Следующим открытием для вас будут понятия low endian/big endian. Лучше берите готовый сериализатор.


Спасибо, что открыл мне глаза
Маньяк Робокряк колесит по городу
Re[15]: Арифметика long double
От: _NN_ www.nemerleweb.com
Дата: 14.01.24 21:29
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, _NN_, Вы писали:


_NN>>А что мешает взять простое готовое решение, скажем Protobuf, а не создавать своё полуработающее поделие.


M>Потому что в 90% случаев данные приходят и уходят от/в сторонный софт


А как этот сторонний софт решил проблему сериализации?
Вряд ли записывает данные которые невозможно прочитать будет на другой платформе.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[16]: Арифметика long double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.01.24 21:34
Оценка:
Здравствуйте, _NN_, Вы писали:

M>>Потому что в 90% случаев данные приходят и уходят от/в сторонный софт


_NN>А как этот сторонний софт решил проблему сериализации?

_NN>Вряд ли записывает данные которые невозможно прочитать будет на другой платформе.

Сериализовали тупо структурами. Просто компилятор был другой. Вот тебе простой пример
Маньяк Робокряк колесит по городу
Re[17]: Арифметика long double
От: _NN_ www.nemerleweb.com
Дата: 15.01.24 06:03
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, _NN_, Вы писали:


M>>>Потому что в 90% случаев данные приходят и уходят от/в сторонный софт


_NN>>А как этот сторонний софт решил проблему сериализации?

_NN>>Вряд ли записывает данные которые невозможно прочитать будет на другой платформе.

M>Сериализовали тупо структурами. Просто компилятор был другой. Вот тебе простой пример


В таком случае это конечно боль.
Надо в своём коде определить всё в точности как в другом.

Даже при одном компиляторе с разным порядком заголовочных файлов и разных флагов можно получить неправильную сериализацию.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[12]: Арифметика long double
От: TheBeginner  
Дата: 15.01.24 16:03
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Следующим открытием для вас будут понятия low endian/big endian. Лучше берите готовый сериализатор.


Ага. Только big endian мертв на всех популярных десктопных и серверных платформах если мы про передачу файлов говорим. Даже IBM Power на их собственных процессорах и ОС перешли на little endian.
Re[3]: Арифметика long double
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 08.02.24 11:45
Оценка:
Здравствуйте, kov_serg, Вы писали:

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


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

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

У Лаптева контекста кроме x86 не бывает (покамест)
А на POWER много хитрого есть, даже десятичная плавучка в железе.

_>И в intel x64 смешивать использование FPU, SSE и AVX не благославляется. При это 80bit регистры FPU чуть ли не depricated. Прямо большими буквами написано или то или другое иначе пи%&ец.


Тем не менее их тоже лечат. Например, примерно с 2008 стали лечить старые проблемы с непредсказуемо большим временем работы с денормализованными. Видимо, кто-то из крупных клиентов додавил.
The God is real, unless declared integer.
Re: Арифметика long double
От: fk0 Россия https://fk0.name
Дата: 04.05.24 10:35
Оценка:
Здравствуйте, LaptevVV, Вы писали:

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


А зачем обязательно в железе-то? В железе есть хотя бы float и все остальные операции
можно свести к нему. Ну и что, что в 10 раз медленее. Зачем вообще long double -- ещё вопрос.
Числа с плавающей точкой затем и придуманы, чтоб не нужны были очень длинные целочисленные.
Re[12]: Арифметика long double
От: пффф  
Дата: 04.05.24 11:44
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Например, wchar_t 4 байта в GCC но 2 байта в MSVC.


У GCC под винду wchar_t 4 байта? Хм, интересно, а как это тогда сопрягается с WinAPI?
Re[2]: Арифметика long double
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.05.24 18:35
Оценка:
Здравствуйте, fk0, Вы писали:

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


fk0> А зачем обязательно в железе-то? В железе есть хотя бы float и все остальные операции

fk0>можно свести к нему. Ну и что, что в 10 раз медленее. Зачем вообще long double -- ещё вопрос.

Если вы уж хотите эмулировать double, например, на float... легче на целых эмулировать.

fk0>Числа с плавающей точкой затем и придуманы, чтоб не нужны были очень длинные целочисленные.


При чём тут это?
The God is real, unless declared integer.
Re[3]: Арифметика long double
От: Pzz Россия https://github.com/alexpevzner
Дата: 05.05.24 20:48
Оценка:
Здравствуйте, LaptevVV, Вы писали:

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

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

В SSE/AVX часть команд толерантно относятся к выравниванию, а часть прям требуют выравнивание на размер соответствующего регистра (т.е., 128/256/512 бит, в зависимости от команды).

Поубивал бы.
Re[7]: Арифметика long double
От: Pzz Россия https://github.com/alexpevzner
Дата: 05.05.24 20:52
Оценка:
Здравствуйте, Marty, Вы писали:

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


Не надо так вообще делать, оставлять чтение-запись в файл на усмотрение компилятора. Чиселки в файле должны в каком-то стандарте быть (IEEE 754 с выбранной тобой, а не компилятором, битностью и byte ordering — хороший вариант), но никто тебе не обещал, что в памяти на хосте они у тебя будут в таком же виде.
Re[13]: Арифметика long double
От: Pzz Россия https://github.com/alexpevzner
Дата: 05.05.24 20:56
Оценка:
Здравствуйте, TheBeginner, Вы писали:

TB>Ага. Только big endian мертв на всех популярных десктопных и серверных платформах если мы про передачу файлов говорим. Даже IBM Power на их собственных процессорах и ОС перешли на little endian.


Вроде как у вполне живых ARM-ов бывает BE. MIPS, кажется, бывает BE, и MIPS иногда ставят во всякие там роутеры. И китайцы MIPS любят, они умеют его делать сами. IBM/390 — он не BE разве?

В общем, я б не стал пока списывать BE со счета.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.