![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Всем привет,
Допустим, мне не хватает точности типа double, хочу использовать в два раза более длинное представление. Но поддержки компиляторами встроенного 128-битного вещественного (да и целого тоже) типа не наблюдаю, несмотря на то, что в C99 про него уже упоминается, да и компьютеры в промышленном производстве уже 4 года как с 64-битными регистрами (Которые, по-моему, реализуют поддержку операций с четверными словами на аппаратном уровне..?). Что же это такое? ![]()
Это сообщение отредактировал(а) marcusmae - 13.2.2008, 00:33 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
marcusmae, вообще-то 64-х разряный процессор, это не значит, что он имеет 128-разрядные инструкции. Многое зависит от математического модуля (уже сопроцессором его называть язык не поворачивается). А еще больше - от компилятора.
А потом, неужели ты работаешь под 64-х разрядной ОС?
gcc версия 4.1.2 (Gentoo 4.1.2)
|
||||||
|
|||||||
marcusmae |
|
||||||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
bsa, ну если процессор поддерживает SSE, то 128-битные инструкции у него есть ![]() вот именно. Дело, в первую очередь, в компиляторе, машинная поддержка - дело второе. Если инструкции не поддерживаются, то об этом можно выкинуть ошибку. Но я выразил удивление тому, что, на мой взгляд, качество компиляторов весьма заметно недотягивает до качества машин. Да.
Тест :
Последние три типа являются структурами и предназначены, видимо, исключительно для внутреннего употребления. Так что вот, я не знаю, как 16 байт от него добиться... Это сообщение отредактировал(а) marcusmae - 13.2.2008, 02:17 -------------------- ἀπὸ μηχανῆς θεός |
||||||||
|
|||||||||
Pulse69 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 28.4.2006 Где: Хабаровск Репутация: 1 Всего: 10 |
Насколько я знаю, эти типы (__m128, __m128i, __m128d) применяются в наборе MS SIMD Intrinsics, т.е. инструкции процессора, позволяющие использовать Single Instruction Multiple Data модель.
Грубо говоря, в 128-битный тип __m128 запаковывают вектор из 2х 64-битных double чисел, потом два таких вектора можно, например, умножить одной инструкцией процессора (если он поддерживает SSE), и распаковать. Т.е. попытка использовать типы SIMD intrinsics для повышения точности вычислений вряд ли даст желаемый эффект. Скорее, SIMD следует использовать для оптимизации работы с векторами и матрицами. --------------------
Ctrl+Alt+Reset |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
есть еще аналогичный тип __m64 для работы с MMX, кстати у MS очень удобно работать с SIMD расширениями.
А использовать нужно __int64, __int128. Даже если процессор не позволяет работать с такими числами, все-равно возможна эмуляция. Можно-же использовать на 8-битном процессора не только байты)) Добавлено через 2 минуты и 10 секунд
правильно знаешь)) могу добавить, что AFAIK они должны иметь определенное выравнивание, просто так их использовать нельзя |
|||
|
||||
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Ну да, на то они называются intrinsics. А вот как long double в gcc - полноценный тип? -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
marcusmae, а что ты понимаешь под словом "полноценный"? Это стандартный тип. Параметры которого не хуже, чем у double (так стандарт гласит?). судя по выводу моей проги, он отличается от double по размеру в 2 раза. Вот и все. Работать с ним никогда не приходилось.
Попутно нашел глюк у gcc: sizeof(long long double) = 8; long long double d = 123.455; //вызывает предупреждение о присвоении переменной типа long long int числа с плавающей точкой |
|||
|
||||
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
bsa, спасибо!
неплохо ![]() Ну, может, кто-то напишет, кому приходилось. А я тем временем выяснил, что long double поддерживается компиляторами gcc, IBM и, вроде бы, PGI. -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
Kappac |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 203 Регистрация: 30.9.2006 Где: Украина, Киев Репутация: нет Всего: нет |
Такие ограничения скорей всего принадлежат операционке, потому как на разных системах один и тот же компилятор выдает разные результаты теста. В зависимости от потребностей можете попробовать использовать битовые последовательности.
--------------------
|
|||
|
||||
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Kappac,
думаю, не так однозначно, но отчасти да, возможно Скажем, в Intel Fortran аналогом long double является тип real(16) - 16-байтовое вещественное. Просто поставил и поехал, а компилятор сам разберётся, как его проецировать на возможности ОС и оборудования. Аналогично, в .NET - тип decimal. Вы имете в виду специализированные пакеты типа арифметики больших чисел? = Вот я как раз расчитывал без них обойтись... Всё-таки long double - это не такая уж экзотика. -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
marcusmae, как видишь, гарантировать точность long double тебе никто не может.
|
|||
|
||||
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Э... не вижу, где? Читаем help :
-------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
marcusmae, а я разве что-то про real(16) говорил?
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
это точно компилируется? разрядность процессора? разрядность ОС? у меня С2D, 64-bit Linux, GCC 4.1.2 float = 4 (single precision) double = 8 (double precision) long double = 16 (double extended precision) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Kappac |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 203 Регистрация: 30.9.2006 Где: Украина, Киев Репутация: нет Всего: нет |
При всем моем глубоком уважении, Максим, это дейтсвительно так(long long double = 8). Может стоит попробовать другой компилятор? Попробуйте, что на этот вопрос ответит gcc на вашей машине. Это сообщение отредактировал(а) Kappac - 14.2.2008, 20:51 --------------------
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |