Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > 128-битные данные и арифметика |
Автор: marcusmae 13.2.2008, 00:25 |
Всем привет, Допустим, мне не хватает точности типа double, хочу использовать в два раза более длинное представление. Но поддержки компиляторами встроенного 128-битного вещественного (да и целого тоже) типа не наблюдаю, несмотря на то, что в C99 про него уже упоминается, да и компьютеры в промышленном производстве уже 4 года как с 64-битными регистрами (Которые, по-моему, реализуют поддержку операций с четверными словами на аппаратном уровне..?). Что же это такое? ![]()
|
Автор: bsa 13.2.2008, 01:03 | ||||||
marcusmae, вообще-то 64-х разряный процессор, это не значит, что он имеет 128-разрядные инструкции. Многое зависит от математического модуля (уже сопроцессором его называть язык не поворачивается). А еще больше - от компилятора. А потом, неужели ты работаешь под 64-х разрядной ОС?
gcc версия 4.1.2 (Gentoo 4.1.2)
|
Автор: Pulse69 13.2.2008, 07:27 |
Насколько я знаю, эти типы (__m128, __m128i, __m128d) применяются в наборе MS SIMD Intrinsics, т.е. инструкции процессора, позволяющие использовать Single Instruction Multiple Data модель. Грубо говоря, в 128-битный тип __m128 запаковывают вектор из 2х 64-битных double чисел, потом два таких вектора можно, например, умножить одной инструкцией процессора (если он поддерживает SSE), и распаковать. Т.е. попытка использовать типы SIMD intrinsics для повышения точности вычислений вряд ли даст желаемый эффект. Скорее, SIMD следует использовать для оптимизации работы с векторами и матрицами. |
Автор: Lazin 13.2.2008, 10:33 | ||
есть еще аналогичный тип __m64 для работы с MMX, кстати у MS очень удобно работать с SIMD расширениями. А использовать нужно __int64, __int128. Даже если процессор не позволяет работать с такими числами, все-равно возможна эмуляция. Можно-же использовать на 8-битном процессора не только байты)) Добавлено через 2 минуты и 10 секунд
правильно знаешь)) могу добавить, что AFAIK они должны иметь определенное выравнивание, просто так их использовать нельзя |
Автор: marcusmae 13.2.2008, 12:34 | ||
Ну да, на то они называются intrinsics. А вот как long double в gcc - полноценный тип? |
Автор: bsa 14.2.2008, 00:03 |
marcusmae, а что ты понимаешь под словом "полноценный"? Это стандартный тип. Параметры которого не хуже, чем у double (так стандарт гласит?). судя по выводу моей проги, он отличается от double по размеру в 2 раза. Вот и все. Работать с ним никогда не приходилось. Попутно нашел глюк у gcc: sizeof(long long double) = 8; long long double d = 123.455; //вызывает предупреждение о присвоении переменной типа long long int числа с плавающей точкой |
Автор: marcusmae 14.2.2008, 00:19 |
bsa, спасибо! неплохо ![]() Ну, может, кто-то напишет, кому приходилось. А я тем временем выяснил, что long double поддерживается компиляторами gcc, IBM и, вроде бы, PGI. |
Автор: Kappac 14.2.2008, 11:32 |
Такие ограничения скорей всего принадлежат операционке, потому как на разных системах один и тот же компилятор выдает разные результаты теста. В зависимости от потребностей можете попробовать использовать битовые последовательности. |
Автор: marcusmae 14.2.2008, 13:46 |
Kappac, думаю, не так однозначно, но отчасти да, возможно Скажем, в Intel Fortran аналогом long double является тип real(16) - 16-байтовое вещественное. Просто поставил и поехал, а компилятор сам разберётся, как его проецировать на возможности ОС и оборудования. Аналогично, в .NET - тип decimal. Вы имете в виду специализированные пакеты типа арифметики больших чисел? = Вот я как раз расчитывал без них обойтись... Всё-таки long double - это не такая уж экзотика. |
Автор: bsa 14.2.2008, 13:52 |
marcusmae, как видишь, гарантировать точность long double тебе никто не может. |
Автор: marcusmae 14.2.2008, 14:04 | ||
Э... не вижу, где? Читаем help :
|
Автор: bsa 14.2.2008, 15:10 |
marcusmae, а я разве что-то про real(16) говорил? |
Автор: MAKCim 14.2.2008, 15:33 |
это точно компилируется? разрядность процессора? разрядность ОС? у меня С2D, 64-bit Linux, GCC 4.1.2 float = 4 (single precision) double = 8 (double precision) long double = 16 (double extended precision) |
Автор: Kappac 14.2.2008, 20:50 | ||
При всем моем глубоком уважении, Максим, это дейтсвительно так(long long double = 8).
Может стоит попробовать другой компилятор? Попробуйте, что на этот вопрос ответит gcc на вашей машине. |
Автор: Alexeis 14.2.2008, 21:03 |
В билдере это 10 байт, т.е. нативный тип для сопроцессора. Так что не какой гарантии. |
Автор: MAKCim 14.2.2008, 21:59 | ||||
это не компилируется по крайней мере на моей системе Добавлено через 1 минуту и 18 секунд
а я гарантий и не давал просто задал вопрос bsa он, скорее всего тоже на 64-х битной системе тестировал через GCC |
Автор: Kappac 15.2.2008, 11:00 |
Мои машины: 1. Turion MK36 x64, GCC - 4.1.2 2. Windows XP SP2 х86, GCC - 4.1.2 Компилируется и дает 8 байт. |
Автор: bsa 15.2.2008, 12:23 | ||
MAKCim
|