этот код увеличивает значение v С -1 или 1 чтобы получить abs (v). Следовательно, внутри скобки будет одна из -1 или 1 .
, когда v == 0 , и (v<0) и (v>0) будет оценивать до 0, оставляя: v * 0 == 0 .
автор: perreal
int abs (int n) < const int ret[2] = < n, -n >; return ret [n
Примечание 4.7 Интегральные Преобразования / 4: [. ] If the source type is bool, the value false is converted to zero and the value true is converted to one.
* : в том смысле, что в вашем коде нет условного ветвления. Под капотом троичный оператор также будет производить ветку. Однако это также Правильный ответ, потому что троичный не является if-утверждением. Это не означает, что ваш компилятор не может выдавать код сборки branchfree для код, который логически ветвится.
автор: Sebastian Mach
предполагая 32-битные целые числа со знаком (Java), вы можете написать:
public static int abs(int x) < return (x + (x >> 31)) ^ (x >> 31); >
нет умножения, нет филиала.
Найти минимальный элемент массива. Поиск минимального элемента в массиве. C++ для начинающих. ДЗ#8.
кстати, return (x ^ (x >> 31)) — (x >> 31); будет работать, но он запатентован. Ага!
Примечание: этот код может занять более 10x дольше, чем условный оператор (8-битная версия). Это может быть полезно для системы аппаратного программирования C etc
автор: flanglet
Я пробую этот код в C, и он работает.
int abs(int n)
надеемся, что этот ответ будет полезен.
автор: Quản Bá Hồng Nguyễn
бит сдвигает целые числа со знаком так, как вы считаете, является неопределенным поведением и, следовательно, не является опцией. Вместо этого вы можете сделать следующее:
int abs(int n) < return n >0 ? n : -n; >
нет if операторы, просто условное выражение.
автор: Kerrek SB
int abs(int n)
автор: Jeremy
вот еще один подход без abs() , если ни одно логическое / условное выражение: предположим, что int-32-разрядное целое число. Идея довольно проста: (1 — 2 * sign_bit) преобразует sign_bit = 1 / 0 to -1 / 1 .
unsigned int abs_by_pure_math( int a ) < return (1 — (((a >> 31) > 31 | 1 ) * n
Если ваш язык позволяет bool int cast (C / C++ like):
float absB(float n)
автор: Dani Barca Casafont
используйте тернарный оператор:
y = condition ? value_if_true : value_if_false;
автор: Oliver Charlesworth
как насчет этого:
value = value > 0 ? value: ~value + 1
его основано на том факте, что отрицательные числа хранятся как дополнение 2 к положительному эквиваленту, и что можно построить дополнение 2, сначала построив Дополнение 1 и добавив 1, так что
5 -> 0000 0101b -5 -> (1111 1010b) + 1 -> 1111 1011b
то, что я сделал в основном чтобы отменить это, так
-5 -> 1111 1011b 5 -> (0000 0100b) + 1 -> 0000 0101b
Я знаю, что немного поздно, но просто имел ту же проблему и приземлился здесь, Надеюсь, это поможет.
автор: Martin
есть несколько причин, по которым левый сдвиг знака бит и правый сдвиг на место ( v > 1 ):
Абсолютное значение числа. Функция abs. Уроки программирования на С++ для начинающих.
- левое смещение знакового типа с отрицательным значением имеет неопределенное поведение, поэтому его вообще не следует использовать.
- приведение значения к unsigned будет иметь желаемый эффект: (unsigned)v > 1 избавляется от бита знака, если нет бит заполнения, но результирующее значение является абсолютным значением v только на системах со знаком + величина репрезентация, которая в наши дни исчезающе редка. На вездесущей архитектуре дополнения 2, результирующее значение для отрицательного v is INT_MAX+1-v
решение Hasturkun, к сожалению, имеет определенное поведение реализации.
вот вариант, который полностью определен для систем с представлением дополнения 2 для подписанных значений:
int v; // we want to find the absolute value of v unsigned int r; // the result goes here unsigned int mask = -((unsigned int)v >> (sizeof(unsigned int) * CHAR_BIT — 1)); r = ((unsigned int)v + mask) ^ mask;
автор: chqrlie
нет ветвей или умножения:
Источник: askdev.ru
Возвращение абсолютного числа без Math.abs!Решение найдено, нужно объяснение!?
Может кто расскажет по буквам) что именно здесь происходит?Хочу не просто списать ,а и понять!
Вроде именно то что нужно, может кто и другие варианты знает реализации , для сравнения)?
- Вопрос задан более двух лет назад
- 1430 просмотров
2 комментария
Простой 2 комментария
Ну, приведённая программа написана как-то криво, неаккуратно. Я бы сделал так:
function MyMathAbs(number) < if (number < 0) < return -number; >else < return number; >>
Так лучше читается.
Если непонятно, как оно работает — надо вручную (или под отладчиком) выполнить эту программу для нескольких частных случаев.
Источник: qna.habr.com
Функция abs() в Python
В этой статье мы представим функцию Python abs() с различными модулями, такими как NumPy и Pandas.
Python имеет огромное количество встроенных функций для выполнения математических и статистических операций. Одной из таких функций является функция abs().
Функция abs() function возвращает абсолютную величину или значение входных данных, переданных ей в качестве аргумента. Он возвращает фактическое значение ввода без учета знака.
Она принимает только один аргумент, который должен быть числом, и возвращает абсолютную величину числа.
- Если входные данные имеют тип integer или float — функция возвращает абсолютную величину / значение.
- Если введено complex number , функция abs() возвращает только часть величины числа.
abs(number)
- Число может быть целочисленного типа, типа с плавающей запятой или комплексного числа.
num = -25.78 print(«Absolute value:»,abs(num))
Absolute value: 25.78
Функция Pandas DataFrame.abs()
Модуль Python Pandas имеет встроенную DataFrame.abs() function для вычисления абсолютного значения всех значений данных, присутствующих в конкретной переменной / столбце данных фрейма данных набора данных.
DataFrame[‘column_name’].abs()
Входной набор данных:
import pandas as pd import numpy as np data = pd.read_csv(«C:/marketing_tr.csv») data.head(10) data[‘cons.conf.idx’].abs()
В приведенном выше фрагменте кода мы использовали pandas.read_csv() function для импорта и загрузки набора данных в среду. Функция DataFrame.head(n) function фактически представляет первые n значений набора данных.
Далее мы выяснили абсолютные значения столбца cons.conf.idx.
0 42.0 1 42.7 2 36.4 3 42.7 4 46.2 . 7409 36.4 7410 42.7 7411 46.2 7412 42.0 7413 36.4 Name: cons.conf.idx, Length: 7414, dtype: float64
Функция numpy.absolute()
Модуль Python NumPy имеет numpy.absolute() function для получения абсолютных значений переданных ему элементов массива.
numpy.absolute(array)
import numpy as np arr = [10, -20, 30, -40] abs_res = np.absolute(arr) print(«The absolute values of the array elements:»,abs_res)
The absolute values of the array elements: [10 20 30 40]
Источник: pythononline.ru