Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 128-битные данные и арифметика, long double and etc. 
:(
    Опции темы
marcusmae
Дата 13.2.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Всем привет,

Допустим, мне не хватает точности типа double, хочу использовать в два раза более длинное представление. Но поддержки компиляторами встроенного 128-битного вещественного (да и целого тоже) типа не наблюдаю, несмотря на то, что в C99 про него уже упоминается, да и компьютеры в промышленном производстве уже 4 года как с 64-битными регистрами (Которые, по-моему, реализуют поддержку операций с четверными словами на аппаратном уровне..?). 

Что же это такое? smile Никому не надо или какие-то у всех проблемы или я чего-то недоглядел? AFAIK, разброд полный :
  •  В M$ C/C++ есть целый выводок __m128i, __m128d и др., но применить их впрямую у меня не получилось
  •  Вместе с тем для M$ sizeof(double) = sizeof(long double) = 8, для других компиляторов sizeof(long double) случается равным 10 и 12. Но только не 16 smile А некоторые честно пишут, что not supported.
Короче, может кто-то применяет у себя 128-битные типы? Расскажите, пожалуйста, как.

Это сообщение отредактировал(а) marcusmae - 13.2.2008, 00:33


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
bsa
Дата 13.2.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



marcusmae, вообще-то 64-х разряный процессор, это не значит, что он имеет 128-разрядные инструкции. Многое зависит от математического модуля (уже сопроцессором его называть язык не поворачивается). А еще больше - от компилятора.
А потом, неужели ты работаешь под 64-х разрядной ОС?
Код
#include <iostream>

int main()
{
        std::cout << "char:" << sizeof(char) << std::endl;
        std::cout << "short:" << sizeof(short) << std::endl;
        std::cout << "int:" << sizeof(int) << std::endl;
        std::cout << "long:" << sizeof(long) << std::endl;
        std::cout << "long long:" << sizeof(long long) << std::endl;
        std::cout << "float:" << sizeof(float) << std::endl;
        std::cout << "double:" << sizeof(double) << std::endl;
        std::cout << "long double:" << sizeof(long double) << std::endl;
        return 0;
}
Вывод:
Код
$ ./test 
char:1
short:2
int:4
long:8
long long:8
float:4
double:8
long double:16

gcc версия 4.1.2 (Gentoo 4.1.2)
Цитата(uname -a)

Linux bsa 2.6.23-gentoo-r6 #1 SMP PREEMPT Thu Jan 24 21:10:47 MSK 2008 x86_64 AMD Athlon™ 64 X2 Dual Core Processor 4600+ AuthenticAMD GNU/Linux


PM   Вверх
marcusmae
Дата 13.2.2008, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Цитата(bsa @  13.2.2008,  01:03 Найти цитируемый пост)
вообще-то 64-х разряный процессор, это не значит, что он имеет 128-разрядные инструкции


bsa, ну если процессор поддерживает SSE, то 128-битные инструкции у него есть smile Но это не суть важно,
Цитата(bsa @  13.2.2008,  01:03 Найти цитируемый пост)
А еще больше - от компилятора

вот именно. Дело, в первую очередь, в компиляторе, машинная поддержка - дело второе. Если инструкции не поддерживаются, то об этом можно выкинуть ошибку. Но я выразил удивление тому, что, на мой взгляд, качество компиляторов весьма заметно недотягивает до качества машин.

Цитата(bsa @  13.2.2008,  01:03 Найти цитируемый пост)
А потом, неужели ты работаешь под 64-х разрядной ОС?

Да.

Цитата

Microsoft Windows [Version 6.0.6000]
Copyright © 2006 Microsoft Corporation.  All rights reserved.

C:\Users\Mae Marcus>systeminfo

OS Name:                   MicrosoftR Windows VistaT Ultimate
OS Version:                6.0.6000 N/A Build 6000
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Standalone Workstation
OS Build Type:             Multiprocessor Free
Registered Owner:          Mae Marcus
Registered Organization:
System Boot Time:          2/12/2008, 12:40:35 PM
System Type:               x64-based PC
Processor(s):              1 Processor(s) Installed.
                           [01]: EM64T Family 6 Model 15 Stepping 2 GenuineIntel
 ~1200 Mhz
BIOS Version:              American Megatrends Inc. 0706   , 5/2/2007
Total Physical Memory:     951 MB
Available Physical Memory: 95 MB
Page File: Max Size:       2,156 MB
Page File: Available:      595 MB
Page File: In Use:         1,561 MB


Тест :

Код

#include "stdafx.h"
#include <iostream>
#include <xmmintrin.h>
#include <emmintrin.h>

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << "char:" << sizeof(char) << std::endl;
    std::cout << "short:" << sizeof(short) << std::endl;
    std::cout << "int:" << sizeof(int) << std::endl;
    std::cout << "long:" << sizeof(long) << std::endl;
    std::cout << "long long:" << sizeof(long long) << std::endl;
    std::cout << "float:" << sizeof(float) << std::endl;
    std::cout << "double:" << sizeof(double) << std::endl;
    std::cout << "long double:" << sizeof(long double) << std::endl;

    std::cout << std::endl;
    std::cout << "__m128:" << sizeof(__m128) << std::endl;
    std::cout << "__m128i:" << sizeof(__m128i) << std::endl;
    std::cout << "__m128d:" << sizeof(__m128d) << std::endl;

    std::cin.get();
    return 0;
}


Код

char:1
short:2
int:4
long:4
long long:8
float:4
double:8
long double:8

__m128:16
__m128i:16
__m128d:16


Последние три типа являются структурами и предназначены, видимо, исключительно для внутреннего употребления. Так что вот, я не знаю, как 16 байт от него добиться...

Это сообщение отредактировал(а) marcusmae - 13.2.2008, 02:17


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Pulse69
Дата 13.2.2008, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 
PM MAIL   Вверх
Lazin
Дата 13.2.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



есть еще аналогичный тип __m64 для работы с MMX, кстати у MS очень удобно работать с SIMD расширениями.
А использовать нужно __int64, __int128. 
Даже если процессор не позволяет работать с такими числами, все-равно возможна эмуляция. Можно-же использовать на 8-битном процессора не только байты))

Добавлено через 2 минуты и 10 секунд
Цитата(Pulse69 @  13.2.2008,  07:27 Найти цитируемый пост)
Насколько я знаю, эти типы (__m128, __m128i, __m128d) применяются в наборе MS SIMD Intrinsics

правильно знаешь)) 
могу добавить, что AFAIK они должны иметь определенное выравнивание, просто так их использовать нельзя
PM MAIL Skype GTalk   Вверх
marcusmae
Дата 13.2.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Цитата(Lazin @  13.2.2008,  10:33 Найти цитируемый пост)
Даже если процессор не позволяет работать с такими числами, все-равно возможна эмуляция.


Ну да, на то они называются intrinsics.

А вот как long double в gcc - полноценный тип?



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
bsa
Дата 14.2.2008, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 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 числа с плавающей точкой

PM   Вверх
marcusmae
Дата 14.2.2008, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



bsa, спасибо!

Цитата(bsa @  14.2.2008,  00:03 Найти цитируемый пост)
Попутно нашел глюк у gcc:

неплохо smile

Цитата(bsa @  14.2.2008,  00:03 Найти цитируемый пост)
Работать с ним никогда не приходилось.

Ну, может, кто-то напишет, кому приходилось. А я тем временем выяснил, что long double поддерживается компиляторами gcc, IBM и, вроде бы, PGI.



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Kappac
Дата 14.2.2008, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



Такие ограничения скорей всего принадлежат операционке, потому как на разных системах один и тот же компилятор выдает разные результаты теста. В зависимости от потребностей можете попробовать использовать битовые последовательности. 
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
marcusmae
Дата 14.2.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Kappac

Цитата(Kappac @  14.2.2008,  11:32 Найти цитируемый пост)
Такие ограничения скорей всего принадлежат операционке

думаю, не так однозначно, но отчасти да, возможно

Скажем, в Intel Fortran аналогом long double является тип real(16) - 16-байтовое вещественное. Просто поставил и поехал, а компилятор сам разберётся, как его проецировать на возможности ОС и оборудования. Аналогично, в .NET - тип decimal.

Цитата(Kappac @  14.2.2008,  11:32 Найти цитируемый пост)
 можете попробовать использовать битовые последовательности

Вы имете в виду специализированные пакеты типа арифметики больших чисел? = Вот я как раз расчитывал без них обойтись... Всё-таки long double - это не такая уж экзотика.



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
bsa
Дата 14.2.2008, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



marcusmae, как видишь, гарантировать точность long double тебе никто не может.
PM   Вверх
marcusmae
Дата 14.2.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Цитата(bsa @  14.2.2008,  13:52 Найти цитируемый пост)
как видишь, гарантировать точность long double тебе никто не может


Э... не вижу, где? Читаем help :

Цитата

REAL(16) Constants
A REAL(16) constant has more than four times the accuracy of a REAL(4) number, and a greater range.

A REAL(16) constant occupies 16 bytes of memory. The number of digits that precede the exponent is unlimited, but typically only the leftmost 33 digits are significant.

IEEE X_floating format is used.



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
bsa
Дата 14.2.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



marcusmae, а я разве что-то про real(16) говорил?
PM   Вверх
MAKCim
Дата 14.2.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(bsa @  14.2.2008,  00:03 Найти цитируемый пост)
Попутно нашел глюк у gcc:
sizeof(long long double) = 8;

это точно компилируется?
разрядность процессора? разрядность ОС?
у меня С2D, 64-bit Linux, GCC 4.1.2
float = 4 (single precision)
double = 8 (double precision)
long double = 16 (double extended precision)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Kappac
Дата 14.2.2008, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



Цитата(MAKCim @  14.2.2008,  15:33 Найти цитируемый пост)
long double = 16 (double extended precision) 

При всем моем глубоком уважении, Максим, это дейтсвительно так(long long double = 8). 



Цитата(marcusmae @  14.2.2008,  13:46 Найти цитируемый пост)
Вы имете в виду специализированные пакеты типа арифметики больших чисел? = Вот я как раз расчитывал без них обойтись... Всё-таки long double - это не такая уж экзотика.

Может стоит попробовать другой компилятор? Попробуйте, что на этот вопрос ответит gcc на вашей машине.

Это сообщение отредактировал(а) Kappac - 14.2.2008, 20:51
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1183 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.