{«id»:13967,»url»:»/distributions/13967/click?bit=1&hash=ee1d6a7126d1a0c1a04c0b76bb751b02d5cb72d02e4871e98b05ba8e74c7c4a3″,»title»:»u041au0430u043a u0443u0441u043fu0435u0448u043du0435u0435 u043fu0440u043eu0434u0432u0438u0433u0430u0442u044cu0441u044f u0432 u00abu041fu0440u043eu043cu043eu0421u0442u0440u0430u043du0438u0446u0430u0445u00bb u043eu0442 u00abu042fu043du0434u0435u043au0441u0430u00bb»,»buttonText»:»»,»imageUuid»:»»}
Вступление
Всем начинающим кодерам привет!
Модуль числа… Это, казалось бы, простая вещь… да, так оно и есть. Тем не менее — всегда интересно поэкспериментировать и по-новому взглянуть на простое.
Сегодня я покажу вам 6 способов найти модуль числа в Python 3. Я не стал добавлять сюда совсем абсурдные вещи, но немного абсурдности здесь все же будет.
1 способ
Для начала самое очевидное. Проверяем отрицательное число (назовем его x) или положительное, т.е. <0 или нет. В случае отрицательного значения x, его нужно умножить на -1. Можно так:
def abs1(x):
if x < 0:
return x*(-1)
return x
А можно заменить умножение унарным минусом:
def abs1(x):
if x < 0:
return -x
return x
2 способ
Самое короткое решение в нашей статье — найти максимум между x и -x. Таким образом результат всегда будет положительным:
def abs2(x):
return max(-x, x)
3 способ
Здесь мы проверяем строку на наличие в ней минуса. Изначально я хотел использовать метод isdigit(), но потом я понял, что метод не считает точку частью числа, поэтому для float в строке метод возвращает False. Поэтому:
def abs3(x):
if ‘-‘ in str(x):
return -x
return x
4 способ
Этот способ использует условную инструкцию из предыдущей функции, но использует срез, чтобы избавиться от минуса. 3 строка выглядит не очень, приходится дважды менять тип данных результата. По-моему — это ухудшенная версия 3 способа:
def abs4(x):
if ‘-‘ in str(x):
return float(str(x)[1::])
return x
5 способ
Тут мы будем использовать факт того, что операция квадратного корня в Python всегда возвращает положительный результат. Эту операцию не обязательно брать из библиотеки Math, можно просто возвести число в с степень 0.5. Итак:
def abs5(x):
return (x*x)**0.5
6 способ
Здесь мы используем операции со строками, как в 4 способе. Отличие в том, что мы не проверяем строку на наличие минуса. Мы убираем уго, есть он в строке или нет. Метод replace() позволяет убрать все повторения одного символа, что для нас избыточно, но с нулем повторений он тоже работает:
def abs6(x):
return float(str(x).replace(‘-‘, »))
Примечание: говоря про положительные значения, правильнее сказать — положительные или нулевые, но я решил не засорять текст такой мелочью.
Статистика быстродействия
Подведем итоги, узнаем — что же быстрее работает. О том, как замерить время работы программы, я, возможно, расскажу в одной из следующих статей. Ну а пока что приведу статистические данные.
Я измерил время работы данного куска кода, где i — одна из 6 функций.
for j in range(100000):
a = (i(1), i(-1), i(1.0), i(-1.0))
И вот что получилось:
Что у нас по итогу? Худший результат показал 4 способ, неудивительно.Самый очевидный способ — первый, на 2 месте. С большим отрывом лидирует 5 вариант, 100000 повторений за 0.79 сек! Математика быстрее логического оператора if и операций со строками.
Заключение
Я надеюсь, что вам была интересна данная статья, и вы разобрались в теме. Если хотите меня дополнить — пишите в комментариях. Удачи в мире IT!
Abs — функция языка Паскаль, которая вычисляет модуль числа.
Sqr — функция языка Паcкаль, которая возводит число в квадрат.
program number8;
uses crt;
var A, B, C:integer;
begin
clrscr;
A:= -2;
B:=Abs (A);
writeln('Abs(-2)=',B);
C:=Sqr(B);
writeln('Sqr(2)=',C);
readln
end.
Строка №7. Функция Abs вычисляет модуль числа, стоящего в скобках после функции. В данном случае вычисляется модуль переменной «A», которая имеет значение «-2». Так как модуль «|-2|» равен «2», то «2» и будет результатом операции Abs.
Строка №9. Функция Sqr возводит число, стоящее в скобках в квадрат. В данном случае в квадрат возводится переменная «B», т.е. число «2». Таким образом, результатом операции будет число «4».
Дополнение к материалу.
В примерах №6, 7, 8 мы использовали небольшие числа (-2, 3, 17 и т.д.). Для всех переменных, в которые эти числа записывались, мы указывали тип данных INTEGER. Следует сказать, что данный тип данных используется не для всех чисел, а только для целых, лежащих в диапазоне от – 32768 до 32767. И если мы будем использовать в наше программе числа, которые лежат вне этих пределов (например – 32987 или 36789), то мы должны использовать другой тип данных.
Диапазон значений для различных типов данных можно посмотреть в таблице.
| Тип данных | Запись | Длина в байтах |
|---|---|---|
| integer | -32 768….32 767 | 2 |
| byte | 0…255 | 1 |
| word | 0…65 535 | 2 |
| shortint | -128….127 | 1 |
| longint | -2 147 483 648….2 147 483 647 | 4 |
Использование различных типов данных обусловлено тем, что для каждого из них выделяется определенное количество ячеек в памяти компьютера. Если мы используем в программе числа от 0 до 255, то наиболее целесообразно будет использовать тип данных BYTE. Хотя можно использовать и любой другой тип данных. Например, для числа 10 можно использовать и BYTE и LONGINT, но тогда в первом случае будет расходоваться 1 байт в памяти компьютера, а во втором — целых 4 байта. Учитывая то, что программа должна расходовать как можно меньше памяти, рационально будет использовать для данного примера тип данных BYTE.
|
2 / 2 / 0 Регистрация: 16.06.2007 Сообщений: 9 |
|
|
1 |
|
Как найти модуль от числа?20.03.2009, 11:04. Показов 287145. Ответов 18
Вопрос по функции abs. Как найти модуль от числа типа float? В справке указано, что можно, ещё и пример есть (только кажется там не abs, а fabs (проверила всё что нашла)). А когда запускаю — пишет неизвестный идентификатор(в смысле на функцию). Что можно использовать в данной ситуации?
1 |
|
Почетный модератор 7390 / 2636 / 281 Регистрация: 29.07.2006 Сообщений: 13,696 |
|
|
20.03.2009, 11:12 |
2 |
|
math.h подключен?
2 |
|
54 / 50 / 9 Регистрация: 16.05.2008 Сообщений: 162 |
|
|
20.03.2009, 17:10 |
3 |
|
Для float или double надо использовать функцию fabs
0 |
|
2 / 2 / 0 Регистрация: 16.06.2007 Сообщений: 9 |
|
|
22.03.2009, 13:00 [ТС] |
4 |
|
Для float или double надо использовать функцию fabs Пыталась на float он ругается (незвестный идентификатор), а когда переменную объявляю как double всё работает. Но должен же работать и с float. Добавлено через 1 минуту 9 секунд
math.h подключен? Подключен, проблема не в этом.
0 |
|
121 / 121 / 14 Регистрация: 14.03.2009 Сообщений: 462 |
|
|
22.03.2009, 13:20 |
5 |
|
ну на крайний случай функцию мелкую самодельную можно ткнуть, работать будет медленней, но уж точно работать будет Добавлено через 11 минут 6 секунд
0 |
|
54 / 50 / 9 Регистрация: 16.05.2008 Сообщений: 162 |
|
|
23.03.2009, 10:19 |
6 |
|
Пыталась на float он ругается (незвестный идентификатор), а когда переменную объявляю как double всё работает. Но должен же работать и с float. Ну правильно т.к. fabs принимает тип double в качестве аргумента, надо просто привести переменную типа float к double: Код float fValue; fabs((double)FValue); или так Код float fValue; fabs(static_cast<double>(fValue));
1 |
|
KaRTMaN 2 / 2 / 0 Регистрация: 23.03.2009 Сообщений: 55 |
||||
|
23.03.2009, 21:16 |
7 |
|||
|
KATY вот прога
Добавлено через 2 минуты 16 секунд
0 |
|
25 / 25 / 3 Регистрация: 27.12.2009 Сообщений: 82 |
|
|
24.03.2010, 15:14 |
8 |
|
Та же проблема, я использую <iostream>, а не .h, может поэтому не находит???
0 |
|
54 / 50 / 9 Регистрация: 16.05.2008 Сообщений: 162 |
|
|
24.03.2010, 17:30 |
9 |
|
Tani,приведи пример кода. Где и что не получается. Телепатов нет.
0 |
|
Tani 25 / 25 / 3 Регистрация: 27.12.2009 Сообщений: 82 |
||||||||
|
25.03.2010, 14:40 |
10 |
|||||||
|
А жаль..Решила забить код из предыдущего поста- работает, озадачило… У меня перегрузка операции «-» для объекта окружность
Я уже донельзя все упростила, но пишет- идентификатор не найден
0 |
|
BornLeader 54 / 50 / 9 Регистрация: 16.05.2008 Сообщений: 162 |
||||
|
26.03.2010, 14:21 |
11 |
|||
|
Tani,
все работает правильно. Уточни что там не так.
0 |
|
Tani 25 / 25 / 3 Регистрация: 27.12.2009 Сообщений: 82 |
||||||||||||
|
26.03.2010, 14:49 |
12 |
|||||||||||
Выложила , ка у меня есть, ваш код нормально компилит, на моем выдает ошибку на fabs, я че-то ваще уже растерялась(((
0 |
|
54 / 50 / 9 Регистрация: 16.05.2008 Сообщений: 162 |
|
|
26.03.2010, 15:12 |
13 |
|
Tani, правильно кампилятор ругается: для fabs необходимо подключить math.h , #include <math.h> должна находиться в твоем случае не в файле где функция main, а Ну и маленькое замечание: у тебя методы класса vvod и vivod не возвращают никакого значения поэтому конструкция типа
1 |
|
25 / 25 / 3 Регистрация: 27.12.2009 Сообщений: 82 |
|
|
26.03.2010, 15:25 |
14 |
|
Хех, понятно, просто для функций все в main же подключается? Я сделала по аналогии…А насчет void методов ( и функций тоже?) буду знать, но писать придется так, нас так учат =)))
0 |
|
BornLeader 54 / 50 / 9 Регистрация: 16.05.2008 Сообщений: 162 |
||||
|
26.03.2010, 15:39 |
15 |
|||
|
просто для функций все в main же подключается? Подключается только там где это необходимо, в твоем случае у тебя в файле с main
необходимо только
0 |
|
7 / 7 / 1 Регистрация: 18.12.2009 Сообщений: 34 |
|
|
28.03.2010, 14:44 |
16 |
|
Чё за тупость не пойму)) Модуль же можно найти просто домножив на -1 если число отрицательное и оставить прежним если положительное
1 |
|
25 / 25 / 3 Регистрация: 27.12.2009 Сообщений: 82 |
|
|
28.03.2010, 15:10 |
17 |
|
Хех))) Как вы гениальны!!! Только нигде больше не показывайте свою гениальность функции fabs и abs по такому принципу и работают, нам для этого и нужны стандартные функции, чтоб самим каждый раз велосипед не изобретать=))) А мне надо было выяснить, почему именно у меня не работают, а не то, как это решить-сама задача проста
0 |
|
5 / 5 / 1 Регистрация: 17.05.2010 Сообщений: 108 |
|
|
17.05.2010, 11:31 |
18 |
|
библиотека math.h -> функция abs считает тип int
1 |
|
taras atavin 4203 / 1795 / 211 Регистрация: 24.11.2009 Сообщений: 27,562 |
||||
|
17.05.2010, 11:35 |
19 |
|||
|
Кажется так:
0 |
Задача сводится к нахождению модуля числа.
Я вижу 2 варианта решения этой задачи.
- Использовать функцию abs(), например abs(-5) вернет 5.
- Реализовать что-то подобное самостоятельно
[cpp]
#include «stdafx.h»
#include «locale.h»
void main()
{
setlocale(0,»Russian»);
printf(«Введите число:n»);
int number=0;
scanf(«%d»,&number);
if(number >= 0)
{
printf(«Модуль данного числа равен: %dn»,number);
}
else
{
printf(«Модуль данного числа равен: %dn»,number*(-1));
}
}
[/cpp]
Достаточно очевидно. Происходит чтение в переменную и определение знака. Далее если число меньше нуля — домножается на -1, иначе просто выводится
-
Модуль числа
-
Вычисление
-
abs
-
fabs
-
Свое решение
-
Модуль комплексного числа
Очень часто возникает необходимость вычисления модуля числа в Python. Рассмотрим, что такое модуль числа, какие есть способы его вычисления. Так же отдельно коснемся комплексных чисел.
Модуль числа
Часто в программировании требуется вычислить абсолютное значение числа. Иначе говоря, отбросить знак.
При вычислении модуля возможны 3 ситуации:
- Когда число больше 0. Если взять его по модулю — не изменится.
- Модуль нуля так же равен нулю.
- У отрицательного числа отбрасываем знак. То есть умножаем его на -1.
Но это все справедливо только для действительных чисел. Чему же тогда будет равен модуль комплексных?
Комплексное число состоит из действительной составляющей и мнимой. Геометрически это можно представить как 2 ортогональные оси: действительную и мнимую. Отмечаем на координатных осях требуемую точку. Модулем будет длина отрезка, проведенного из начала координат в эту точку.
Исходя из теоремы Пифагора получаем, что модуль комплексного числа это корень квадратный из суммы квадратов мнимой и действительной частей.
Вычисление
Вычислять модуль можно следующими способами:
- Используя стандартную функцию abs.
- С помощью функции fabs библиотеки math.
- При помощи самостоятельно написанной функции.
Все эти функции работают как в Python 2, так и в Python 3.
abs
Для вычисления в Python модуля числа используется функция abs. Результат функции того же типа, которого был аргумент.
a = -10 b = abs(a) print(b) print(type(b)) 10 <class 'int'>
fabs
Можно так же воспользоваться функцией fabs из библиотеки math. Библиотеку можно подключить с помощью from math import fabs.
from math import fabs a = -10 b = fabs(a) print(b) print(type(b)) 10.0 <class 'float'>
Отличие abs от fabs заключается в том, что функция abs возвращает значение того же типа, что и аргумент. Функция же fabs вначале преобразует тип аргумента к вещественному числу.
Свое решение
Если по каким то причинам нет возможности или желания использовать стандартные функции, то можно написать свое решение.
Например, можно вычислить воспользоваться тернарным оператором.
a = -10 b = a if a > 0 else -a print(b) 10
На основе такого условия сделаем свою функцию.
def my_abs(a):
return a if a > 0 else -a
print(my_abs(-3))
3
Модуль комплексного числа
Мы разобрались как происходит вычисление с действительными числами. Теперь посмотрим, как в языке программирования Python можно получить модуль комплексного.
Функцией fabs мы не сможем воспользоваться. Если попытаемся это сделать, то получим ошибку приведения комплексного числа к действительному (TypeError).
from math import fabs
a = -10-2j
b = fabs(a)
print(b)
Traceback (most recent call last):
File "main.py", line 3, in <module>
b = fabs(a)
TypeError: can't convert complex to float
А вот с помощью abs преобразование удается.
a = -10-2j b = abs(a) print(b) 10.19803902718557
Или же напишем свою функцию:
from math import sqrt
def my_abs_complex(c):
return sqrt(c.real**2 + c.imag**2)
a = -10-2j
b = my_abs_complex(a)
print(b)
10.198039027185569
Результаты получились одинаковыми. Но нам все равно пришлось подключить библиотеку math для вычисления квадратного корня.




Кстати, r у меня double
Вообще-то 
