Программа принимает на вход число и выводит его абсолютное значение без учета знака

этот код увеличивает значение 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

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

Читайте также:
Определите что будет напечатано в результате выполнения программы s 1

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() возвращает только часть величины числа.
Читайте также:
Лучшие программы для bim проектирования

Python 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru