LINUX.ORG.RU

Совсем забыл спросить: в каких версиях GCC abs работает неправильно?

olegd ★★★
() автор топика
Ответ на: комментарий от Valeriy_Onuchin

abs можно вообще реализовать сбросом одного бита. Но с этим надо осторожно, т.к. злой хак =).

Deleted
()
Ответ на: комментарий от Valeriy_Onuchin

> abs(x) = x > 0 ? x : -x;
> x^2 = x*x

Это-то понятно, я спрашиваю что быстрее: сравнение с нулём + смена знака или умножение на себя. Или во втором случае ещё добавится копирование в другой регистр?

olegd ★★★
() автор топика
Ответ на: комментарий от wfrr

> вроде как abs реализован так:

> (x < 0)? -x: x;

Когда у меня не заработало под MinGW (не было возможности переставить GCC), я сделал

inline double newabs(double x) {if (x<0) return -x; return x;};

Принципиальная разница есть?

olegd ★★★
() автор топика
Ответ на: комментарий от kmeaw

>fabs и fmul на x87.

Именно. И который быстрее?

olegd ★★★
() автор топика
Ответ на: комментарий от Deleted

> abs можно вообще реализовать сбросом одного бита. Но с этим надо осторожно, т.к. злой хак =).

Надеюсь, не понадобится :)

Но под всеми x86 и x86-64 работать будет?

olegd ★★★
() автор топика
Ответ на: комментарий от olegd

> Это-то понятно, я спрашиваю что быстрее: сравнение с нулём + смена знака или умножение на себя. Или во втором случае ещё добавится копирование в другой регистр?

а это разве не дело компилятора?

dilmah ★★★★★
()

Для числа с плавающей точкой abs -- это установка знакового бита в 0.
Умножение по любому сложнее.

Dselect ★★★
()
Ответ на: комментарий от Dselect

> Для числа с плавающей точкой abs -- это установка знакового бита в 0.

но если число загружено в x87 стек то нужно делать fabs. Потому что иначе получится что ты его выгружаешь в память, там сбрасываешь бит, а потом опять загружаешь.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> а это разве не дело компилятора?

Я и спрашиваю: что делает компилятор, и сколько времени это занимает?

olegd ★★★
() автор топика
Ответ на: комментарий от Dselect

> Для числа с плавающей точкой abs -- это установка знакового бита в 0. Умножение по любому сложнее.

Спасибо.

olegd ★★★
() автор топика
Ответ на: комментарий от Deleted

>abs можно вообще реализовать сбросом одного бита.

??

-127 -> 10000001 -> 00000001 -> 1 :)

Ты ещё и инверсию забыл добавить.

KRoN73 ★★★★★
()
Ответ на: комментарий от dilmah

> но если число загружено в x87 стек то нужно делать fabs.

fabs так или иначе нужно делать. Хотя бы потому, что x86 -- это еще
не весь мир. Но по смыслу fabs -- это именно сброс (старшего) бита.

Dselect ★★★
()
Ответ на: комментарий от olegd

> Я и спрашиваю: что делает компилятор, и сколько времени это занимает?

Гык. А я ответил, что делает железка. Так или иначе, компилятор лучше вряд
ли сможет сделать.

Dselect ★★★
()
Ответ на: комментарий от olegd

> Но под всеми x86 и x86-64 работать будет?

Не факт (см. x87 versus SSE), а если и будет, не факт что быстрее, чем то,
что сгенерит gcc.

Бросьте Вы эти фокусы. Единственное, что можно заработать с их помощью,
так это (смертельных) врагов среди людей, которым так или иначе придется
столкнуться с Вашим кодом (пользователей, админов, а особенно программистов,
которым придется ее портировать).

Dselect ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.