Логические операции для чисел с плавающей точкой (GCC C)
Модератор: Модераторы разделов
Логические операции для чисел с плавающей точкой
Доброго времени суток!
Есть ли возможность в GCC, в C коде использовать логические операции(and, not, xor и т.д.) для чисел с плавающей точкой? Или все-таки придется вставку на ассме делать?
P.S. Если что расматриваю вариант -mfpmath=sse.
P.S.S. И не надо извращений с union.
Есть ли возможность в GCC, в C коде использовать логические операции(and, not, xor и т.д.) для чисел с плавающей точкой? Или все-таки придется вставку на ассме делать?
P.S. Если что расматриваю вариант -mfpmath=sse.
P.S.S. И не надо извращений с union.
Re: Логические операции для чисел с плавающей точкой
BratSinot, для начала, объясните, как вы понимаете, например, операцию !1.2345 или 3.145 & 2.73 ?
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
- Сообщения: 423
- ОС: Basic command interpreter
- Контактная информация:
Re: Логические операции для чисел с плавающей точкой
да, можно, получил указатель на память, что хочешь то и делай.
ммм данный пользователь вообще отличается неоднозначными вопросами из разных тем... может принимает чего, а может шило в попе... короче человек теперь в формат вникает, наверно.
ммм данный пользователь вообще отличается неоднозначными вопросами из разных тем... может принимает чего, а может шило в попе... короче человек теперь в формат вникает, наверно.
puts ("Working, please wait...");while(1);
Re: Логические операции для чисел с плавающей точкой
Ну, представьте что представление числа с плавающей запятой в памяти это обычное, целое число и его мы "логически оперируем".
Просто в sse есть такие замечательные инструкции как:
Код:
andnpd - Logically NOT ANDs 2 64bit doubles.
andnps - Logically NOT ANDs 4 32bit singles.
andpd - Logically ANDs 2 64bit doubles.
pand - Logically ANDs 2 128bit registers.
pandn - Logically Inverts the first 128bit operand and ANDs with the second.
por - Logically ORs 2 128bit registers.
pslldq - Logically left shifts 1 128bit value.
psllq - Logically left shifts 2 64bit values.
pslld - Logically left shifts 4 32bit values.
psllw - Logically left shifts 8 16bit values.
psrad - Arithmetically right shifts 4 32bit values.
psraw - Arithmetically right shifts 8 16bit values.
psrldq - Logically right shifts 1 128bit values.
psrlq - Logically right shifts 2 64bit values.
psrld - Logically right shifts 4 32bit values.
psrlw - Logically right shifts 8 16bit values.
pxor - Logically XORs 2 128bit registers.
orpd - Logically ORs 2 64bit doubles.
xorpd - Logically XORs 2 64bit doubles.
Просто логические функции полезны например если надо две переменные местами поменять, а если это делать сложением и вычитанием, то может произойти переполнение.
shotdownsystem писал(а): ↑23.09.2011 22:52да, можно, получил указатель на память, что хочешь то и делай.
А ничего, что у тебя указатель будет типа float/double/long double? А указатель типа void здесь то-же не прокатит.
Если есть расширение для GCC то будет всяко круче, чем самому функцию писать или inline. Да и если inline писать, то если 128-бит, то он может не в регистрах, а в памяти.
-
- Сообщения: 423
- ОС: Basic command interpreter
- Контактная информация:
Re: Логические операции для чисел с плавающей точкой
BratSinot писал(а): ↑23.09.2011 23:03shotdownsystem писал(а): ↑23.09.2011 22:52да, можно, получил указатель на память, что хочешь то и делай.
А ничего, что у тебя указатель будет типа double? А указатель типа void здесь то-же не прокатит.
double b;
int *a=&b;
стоп! теплое и мягкое не путаем. Си, как язык, срать хотел на вашу архитектуру и команды. Хотите менять значения в память - меняйте, только обозначитесь как именно. Телепатов нет. Распознает ли ваши намерения компилятор - не знаю. Хотите уверенности - асм к вашим услугам.
puts ("Working, please wait...");while(1);
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Логические операции для чисел с плавающей точкой
да!
Код: Выделить всё
union{
double x;
unsigned char y[sizeof(double);
}u;
u.x = 3.14;
for(int j = 0; j < sizeof(double); j++)
u.y[j] = ~u.y[j];
только зачем? перед друзьями хвастаться что-ли?
Re: Логические операции для чисел с плавающей точкой
drBatty писал(а): ↑23.09.2011 23:28
да!
Код: Выделить всё
union{ double x; unsigned char y[sizeof(double); }u; u.x = 3.14; for(int j = 0; j < sizeof(double); j++) u.y[j] = ~u.y[j];
Ребята, читайте пожалуйста шапку внимательно и полностью:
P.S.S. И не надо извращений с union.
Тем более, извини меня, там инструкций будет 16 штук! Плюс лишние регистры на цикл, лишние инструкции на прыжок и т.д. А на SSE будет одна.
только зачем? перед друзьями хвастаться что-ли?
Как я уже сказал, можно swap без шансов переполнения устроить, можно будет просто знак сбрасывать и для других целей.
-
- Сообщения: 423
- ОС: Basic command interpreter
- Контактная информация:
Re: Логические операции для чисел с плавающей точкой
а на магическую вариацию команды *xchg* вентилей не хватило?
puts ("Working, please wait...");while(1);
Re: Логические операции для чисел с плавающей точкой
Код: Выделить всё
double c = a;
a = b;
b = c;
А так не?
QUOTE писал(а):только зачем? перед друзьями хвастаться что-ли?
не иначе.
Blog: hikki-tech
Re: Логические операции для чисел с плавающей точкой
shotdownsystem писал(а): ↑23.09.2011 23:46
а на магическую вариацию команды *xchg* вентилей не хватило?
fxch он для FPU, а не SSE, это раз.
В GCC не таких расширений, это два.
И это не даст мне логических операций, это три.
Как я уже сказал, это не даст мне логических операций.
Я в очередной раз вынужден просить писать по ТЕМЕ ВОПРОСА, а все что не касается вопроса, а именно "Логические операции для чисел с плавающей точкой", не постить.
Re: Логические операции для чисел с плавающей точкой
Вовремя отредактировали пост
Просто, для чего именно нужны "Логические операции для чисел с плавающей точкой", если без них можно обойтись?)
Blog: hikki-tech
-
- Сообщения: 423
- ОС: Basic command interpreter
- Контактная информация:
Re: Логические операции для чисел с плавающей точкой
1. и что?
2.3. Оставите в покое gcc, если нужны конкретные команды - используйте местами асм. ну или флаг --telepath
puts ("Working, please wait...");while(1);
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Логические операции для чисел с плавающей точкой
отсыпте мне полкаробля
Re: Логические операции для чисел с плавающей точкой
Ага, вот только я пишу только для amd64 и только для GNU/Linux. Насчет x86 и др. ОС я не уверен. А если в GCC есть стандартное расширение, то с ним проще.
И еще раз:
Я в очередной раз вынужден просить писать по ТЕМЕ ВОПРОСА, а все что не касается вопроса, а именно "Логические операции для чисел с плавающей точкой", не постить.
P.S. Короче все в лучших традициях русскоязычных форумах, пойду на бугор.
Re: Логические операции для чисел с плавающей точкой
Это то же самое, что и с union получается. Недочеты: не нужно и архитектурозависимо.
Re: Логические операции для чисел с плавающей точкой
A) Не тоже-самое
Б) Это вам не нужно
В) В который раз повторю, Читайте шапку ВНИМАТЕЛЬНО:
P.S. Если что расматриваю вариант -mfpmath=sse.
Явно я расматриваю только архитектуры с SSE.
И хватит уже говорить что так, а что эдак. Мне нужно это, а не что-то еще.
Re: Логические операции для чисел с плавающей точкой
В машкоде - да. Если хочется то же - сделай inline-асмом. А результат тот же.
Вам тоже, т.к. если вам нужны именно логические операции над числами с плавающей запятой, то вы явно делаете что-то не то.
Да читал я ее. Архитектуры с SSE - не единственные существующие (точнее, она одна + расширения).
Если бы мы знали, ЗАЧЕМ вам это нужно, мы бы могли посоветовать ближе к делу. И это же таки форум, а не Q&A.
Re: Логические операции для чисел с плавающей точкой
BratSinot, не путайте термиологию. Логические операции - это && ||, а Вы тут рассуждаете о побитовых (bitwise).
Если надо такое, то обратитесь сюда - полный список что поддерживается.
Если надо такое, то обратитесь сюда - полный список что поддерживается.
Спасибо сказали:
Re: Логические операции для чисел с плавающей точкой
Хм, спросить есть ли нестандартное расширение, чтоб обойтись без ассма, это что-то не то?
И что? Если вы хорошо читали, то должны были заметить что я указываю SSE использовать для FP, а в случае с нестандартным расширением языка, компилятор при транслировании в ассм. код не будет например x87 юзать.
Зачем нужны логические операции? Наверное для того чтоб их использовать, не?
Ну, т.к. большинство ЭВМ оперирует не битами, а байтами, то это очевидно, что это будут побитовые.
Если надо такое, то обратитесь сюда - полный список что поддерживается.
Спасибо огромное! Единственный человек который по теме ответил, да еще и хорошую ссылку кинул.
Re: Логические операции для чисел с плавающей точкой
Так комплексные или действительные?
И не понятно что значит "в железе нет"? http://comp-science.hut.ru/Cod/cod.html смотрим представление действительных чисел в памяти и делаем логические операции побитово над ними. С т.з. АЛУ нет никакой разницы является ли операнд частью вещественного числа или целого - это всё набор битов, над которыми можно делать всю логику/арифметику. Абстракции типов данных (int, double...) - это для языков высокого уровня чтобы не думать в какой ячейке лежит экспонента действительного числа, а в какой старший байт мантиссы. Хотите логику с такими числами - ассм ничего не запрещает. Только вот трудно представить что получится результате и как это вообще делать. Типо такой лабуды:
Код: Выделить всё
double a=3.14, b=2.72;
long long aa, bb;
memcpy((void *)&aa,(void *)&a,sizeof(long long)); // sizeof(double) == sizeof(long long)
memcpy((void *)&bb,(void *)&b,sizeof(long long)); // не знаю как на 64-битах
printf("%f\n",aa&bb);
Re: Логические операции для чисел с плавающей точкой
Так комплексные или действительные?
Вещественное, вещественное.
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Логические операции для чисел с плавающей точкой
BratSinot
поймите очень простую вещь: побитные логические операции над числами с плавающей точкой имеют не больше смысла, чем деление на ноль. С т.з. математики. Делить на ноль CPU не умеет, выполнять побитное AND|OR|NOT над числами с плав. точкой тоже. Это вполне логично, и естественно. Просто подучите математику за 4й..8й класс средней школы. И вопросы исчезнут.
поймите очень простую вещь: побитные логические операции над числами с плавающей точкой имеют не больше смысла, чем деление на ноль. С т.з. математики. Делить на ноль CPU не умеет, выполнять побитное AND|OR|NOT над числами с плав. точкой тоже. Это вполне логично, и естественно. Просто подучите математику за 4й..8й класс средней школы. И вопросы исчезнут.
Re: Логические операции для чисел с плавающей точкой
чем деление на ноль. С т.з. математики.
Небольшой оффтоп. С точки зрения математики деление на ноль имеет много смысла.
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Логические операции для чисел с плавающей точкой
Re: Логические операции для чисел с плавающей точкой
Ох, куда-то все в оффтоп скатились, да на ТС накинулись :) Да, ясно, что побитовые операции над вещественными числами имеет мало смысла. Вспоминается разве что Fast Inverse Square Root. Но никто ведь не заставляет понимать это как вещественное число. Понимайте как большое целое, или вектор целых чисел с атомарной операцией над таким вектором. Для скорения вполне может понадобиться.
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Логические операции для чисел с плавающей точкой
дык я и понимал. Но ТС не хочет "извращений" :)
чего хочет - непонятно...