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[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[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 — хороший вариант), но никто тебе не обещал, что в памяти на хосте они у тебя будут в таком же виде.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.