Логические операции для чисел с плавающей точкой (GCC C)

Модератор: Модераторы разделов

Ответить
BratSinot
Сообщения: 812
ОС: Slackware64

Логические операции для чисел с плавающей точкой

Сообщение BratSinot »

Доброго времени суток!

Есть ли возможность в GCC, в C коде использовать логические операции(and, not, xor и т.д.) для чисел с плавающей точкой? Или все-таки придется вставку на ассме делать?
P.S. Если что расматриваю вариант -mfpmath=sse.
P.S.S. И не надо извращений с union.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Логические операции для чисел с плавающей точкой

Сообщение frp »

BratSinot писал(а):
23.09.2011 21:14
Есть ли возможность в GCC, в C коде использовать логические операции(and, not, xor и т.д.) для чисел с плавающей точкой?

Это зачем и как? Логические операции ( && || ! ) применимы только к логическим значениям, побитовые (&, |, ~, ^) - к целым.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Логические операции для чисел с плавающей точкой

Сообщение eddy »

BratSinot, для начала, объясните, как вы понимаете, например, операцию !1.2345 или 3.145 & 2.73 ?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter
Контактная информация:

Re: Логические операции для чисел с плавающей точкой

Сообщение shotdownsystem »

да, можно, получил указатель на память, что хочешь то и делай.

eddy писал(а):
23.09.2011 22:44
BratSinot, для начала, объясните, как вы понимаете, например, операцию !1.2345 или 3.145 & 2.73 ?

ммм данный пользователь вообще отличается неоднозначными вопросами из разных тем... может принимает чего, а может шило в попе... короче человек теперь в формат вникает, наверно.
puts ("Working, please wait...");while(1);
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Логические операции для чисел с плавающей точкой

Сообщение BratSinot »

frp писал(а):
23.09.2011 22:39
Это зачем и как? Логические операции ( && || ! ) применимы только к логическим значениям, побитовые (&, |, ~, ^) - к целым.

eddy писал(а):
23.09.2011 22:44
BratSinot, для начала, объясните, как вы понимаете, например, операцию !1.2345 или 3.145 & 2.73 ?

Ну, представьте что представление числа с плавающей запятой в памяти это обычное, целое число и его мы "логически оперируем".
Просто в 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-бит, то он может не в регистрах, а в памяти.
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter
Контактная информация:

Re: Логические операции для чисел с плавающей точкой

Сообщение shotdownsystem »

BratSinot писал(а):
23.09.2011 23:03
shotdownsystem писал(а):
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: Логические операции для чисел с плавающей точкой

Сообщение drBatty »

BratSinot писал(а):
23.09.2011 21:14
Есть ли возможность в GCC, в C коде использовать логические операции(and, not, xor и т.д.) для чисел с плавающей точкой?

да!

Код: Выделить всё

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];

только зачем? перед друзьями хвастаться что-ли?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Логические операции для чисел с плавающей точкой

Сообщение BratSinot »

drBatty писал(а):
23.09.2011 23:28
BratSinot писал(а):
23.09.2011 21:14
Есть ли возможность в GCC, в C коде использовать логические операции(and, not, xor и т.д.) для чисел с плавающей точкой?

да!

Код: Выделить всё

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 без шансов переполнения устроить, можно будет просто знак сбрасывать и для других целей.
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter
Контактная информация:

Re: Логические операции для чисел с плавающей точкой

Сообщение shotdownsystem »

BratSinot писал(а):
23.09.2011 23:03
Просто логические функции полезны например если надо две переменные местами поменять, а если это делать сложением и вычитанием, то может произойти переполнение.

а на магическую вариацию команды *xchg* вентилей не хватило?
puts ("Working, please wait...");while(1);
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: Логические операции для чисел с плавающей точкой

Сообщение Lan4 »

BratSinot писал(а):
23.09.2011 23:40
Как я уже сказал, можно swap без шансов переполнения устроить...

Код: Выделить всё

double c = a;
a = b;
b = c;

А так не?

QUOTE писал(а):только зачем? перед друзьями хвастаться что-ли?

не иначе.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Логические операции для чисел с плавающей точкой

Сообщение BratSinot »

shotdownsystem писал(а):
23.09.2011 23:46
BratSinot писал(а):
23.09.2011 23:03
Просто логические функции полезны например если надо две переменные местами поменять, а если это делать сложением и вычитанием, то может произойти переполнение.

а на магическую вариацию команды *xchg* вентилей не хватило?

fxch он для FPU, а не SSE, это раз.
В GCC не таких расширений, это два.
И это не даст мне логических операций, это три.

Lan4 писал(а):
23.09.2011 23:54

Код: Выделить всё

double c = a;
a = b;
b = c;

А так не?

Как я уже сказал, это не даст мне логических операций.

Я в очередной раз вынужден просить писать по ТЕМЕ ВОПРОСА, а все что не касается вопроса, а именно "Логические операции для чисел с плавающей точкой", не постить.
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: Логические операции для чисел с плавающей точкой

Сообщение Lan4 »

BratSinot писал(а):
23.09.2011 23:56
Как я уже сказал, это не даст мне логических операций.

Вовремя отредактировали пост ;)
Просто, для чего именно нужны "Логические операции для чисел с плавающей точкой", если без них можно обойтись?)
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter
Контактная информация:

Re: Логические операции для чисел с плавающей точкой

Сообщение shotdownsystem »

BratSinot писал(а):
23.09.2011 23:56
fxch он для FPU, а не SSE, это раз.
В GCC не таких расширений, это два.
И это не даст мне логических операций, это три.

1. и что?
2.3. Оставите в покое gcc, если нужны конкретные команды - используйте местами асм. ну или флаг --telepath
puts ("Working, please wait...");while(1);
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Логические операции для чисел с плавающей точкой

Сообщение drBatty »

отсыпте мне полкаробля
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Логические операции для чисел с плавающей точкой

Сообщение BratSinot »

shotdownsystem писал(а):
24.09.2011 00:06
используйте местами асм

Ага, вот только я пишу только для amd64 и только для GNU/Linux. Насчет x86 и др. ОС я не уверен. А если в GCC есть стандартное расширение, то с ним проще.

И еще раз:
Я в очередной раз вынужден просить писать по ТЕМЕ ВОПРОСА, а все что не касается вопроса, а именно "Логические операции для чисел с плавающей точкой", не постить.
P.S. Короче все в лучших традициях русскоязычных форумах, пойду на бугор.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Логические операции для чисел с плавающей точкой

Сообщение frp »

BratSinot писал(а):
23.09.2011 23:03
Ну, представьте что представление числа с плавающей запятой в памяти это обычное, целое число и его мы "логически оперируем".
Просто в sse есть такие замечательные инструкции как:

Это то же самое, что и с union получается. Недочеты: не нужно и архитектурозависимо.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Логические операции для чисел с плавающей точкой

Сообщение BratSinot »

frp писал(а):
24.09.2011 09:39
Это то же самое, что и с union получается. Недочеты: не нужно и архитектурозависимо.

A) Не тоже-самое
Б) Это вам не нужно
В) В который раз повторю, Читайте шапку ВНИМАТЕЛЬНО:
P.S. Если что расматриваю вариант -mfpmath=sse.

Явно я расматриваю только архитектуры с SSE.

И хватит уже говорить что так, а что эдак. Мне нужно это, а не что-то еще.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Логические операции для чисел с плавающей точкой

Сообщение frp »

BratSinot писал(а):
24.09.2011 13:27
A) Не тоже-самое

В машкоде - да. Если хочется то же - сделай inline-асмом. А результат тот же.
BratSinot писал(а):
24.09.2011 13:27
Б) Это вам не нужно

Вам тоже, т.к. если вам нужны именно логические операции над числами с плавающей запятой, то вы явно делаете что-то не то.
BratSinot писал(а):
24.09.2011 13:27
В) В который раз повторю, Читайте шапку ВНИМАТЕЛЬНО:

Да читал я ее. Архитектуры с SSE - не единственные существующие :) (точнее, она одна + расширения).
BratSinot писал(а):
24.09.2011 13:27
И хватит уже говорить что так, а что эдак. Мне нужно это, а не что-то еще.

Если бы мы знали, ЗАЧЕМ вам это нужно, мы бы могли посоветовать ближе к делу. И это же таки форум, а не Q&A.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Логические операции для чисел с плавающей точкой

Сообщение NickLion »

BratSinot, не путайте термиологию. Логические операции - это && ||, а Вы тут рассуждаете о побитовых (bitwise).
Если надо такое, то обратитесь сюда - полный список что поддерживается.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Логические операции для чисел с плавающей точкой

Сообщение BratSinot »

frp писал(а):
24.09.2011 13:54
BratSinot писал(а):
24.09.2011 13:27
Б) Это вам не нужно

Вам тоже, т.к. если вам нужны именно логические операции над числами с плавающей запятой, то вы явно делаете что-то не то.

Хм, спросить есть ли нестандартное расширение, чтоб обойтись без ассма, это что-то не то?

BratSinot писал(а):
24.09.2011 13:27
В) В который раз повторю, Читайте шапку ВНИМАТЕЛЬНО:

Да читал я ее. Архитектуры с SSE - не единственные существующие :) (точнее, она одна + расширения).

И что? Если вы хорошо читали, то должны были заметить что я указываю SSE использовать для FP, а в случае с нестандартным расширением языка, компилятор при транслировании в ассм. код не будет например x87 юзать.

BratSinot писал(а):
24.09.2011 13:27
И хватит уже говорить что так, а что эдак. Мне нужно это, а не что-то еще.

Если бы мы знали, ЗАЧЕМ вам это нужно, мы бы могли посоветовать ближе к делу. И это же таки форум, а не Q&A.

Зачем нужны логические операции? Наверное для того чтоб их использовать, не?

NickLion писал(а):
24.09.2011 15:58

BratSinot, не путайте термиологию. Логические операции - это && ||, а Вы тут рассуждаете о побитовых (bitwise).

Ну, т.к. большинство ЭВМ оперирует не битами, а байтами, то это очевидно, что это будут побитовые.

Если надо такое, то обратитесь сюда - полный список что поддерживается.

Спасибо огромное! Единственный человек который по теме ответил, да еще и хорошую ссылку кинул.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Логические операции для чисел с плавающей точкой

Сообщение frp »

BratSinot писал(а):
24.09.2011 16:46
Зачем нужны логические операции? Наверное для того чтоб их использовать, не?

Почему именно действительные числа?
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Логические операции для чисел с плавающей точкой

Сообщение BratSinot »

frp писал(а):
24.09.2011 17:53
BratSinot писал(а):
24.09.2011 16:46
Зачем нужны логические операции? Наверное для того чтоб их использовать, не?

Почему именно действительные числа?

Потому-что для целых оно и так есть, а комплексных в железе пока нет(а жалко).
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE
Контактная информация:

Re: Логические операции для чисел с плавающей точкой

Сообщение FlySnake »

BratSinot писал(а):
24.09.2011 18:03
frp писал(а):
24.09.2011 17:53
BratSinot писал(а):
24.09.2011 16:46
Зачем нужны логические операции? Наверное для того чтоб их использовать, не?

Почему именно действительные числа?

Потому-что для целых оно и так есть, а комплексных в железе пока нет(а жалко).

Так комплексные или действительные?
И не понятно что значит "в железе нет"? 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);
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Логические операции для чисел с плавающей точкой

Сообщение BratSinot »

Так комплексные или действительные?

Вещественное, вещественное.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Логические операции для чисел с плавающей точкой

Сообщение frp »

BratSinot писал(а):
24.09.2011 18:03
Потому-что для целых оно и так есть, а комплексных в железе пока нет(а жалко).

Когда коту нечего делать, он яй... Можно вопрос: а зачем над ними делать побитовые операции?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Логические операции для чисел с плавающей точкой

Сообщение drBatty »

BratSinot
поймите очень простую вещь: побитные логические операции над числами с плавающей точкой имеют не больше смысла, чем деление на ноль. С т.з. математики. Делить на ноль CPU не умеет, выполнять побитное AND|OR|NOT над числами с плав. точкой тоже. Это вполне логично, и естественно. Просто подучите математику за 4й..8й класс средней школы. И вопросы исчезнут.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Логические операции для чисел с плавающей точкой

Сообщение BratSinot »

чем деление на ноль. С т.з. математики.

Небольшой оффтоп. С точки зрения математики деление на ноль имеет много смысла.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Логические операции для чисел с плавающей точкой

Сообщение drBatty »

FlySnake писал(а):
24.09.2011 19:55
Только вот трудно представить что получится результате и как это вообще делать. Типо такой лабуды:

это тоже самое, что моё union{};
для ТС это неприемлемо.
а получится естественно НЕЧИСЛО. Даже в том случае, если случайно ЭТО окажется числом. Подробности см. здесь


BratSinot писал(а):
25.09.2011 09:29
Небольшой оффтоп. С точки зрения математики деление на ноль имеет много смысла.

ага. СЛИШКОМ много смысла.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Логические операции для чисел с плавающей точкой

Сообщение NickLion »

Ох, куда-то все в оффтоп скатились, да на ТС накинулись :) Да, ясно, что побитовые операции над вещественными числами имеет мало смысла. Вспоминается разве что Fast Inverse Square Root. Но никто ведь не заставляет понимать это как вещественное число. Понимайте как большое целое, или вектор целых чисел с атомарной операцией над таким вектором. Для скорения вполне может понадобиться.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Логические операции для чисел с плавающей точкой

Сообщение drBatty »

NickLion писал(а):
26.09.2011 15:26
Понимайте как большое целое, или вектор целых чисел с атомарной операцией над таким вектором. Для скорения вполне может понадобиться.

дык я и понимал. Но ТС не хочет "извращений" :)
чего хочет - непонятно...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ответить