Как найти модуль в программе

{«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».

abs sqr

abs sqr.



Дополнение к материалу.

В примерах №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

Цитата
Сообщение от BornLeader
Посмотреть сообщение

Для float или double надо использовать функцию fabs

Пыталась на float он ругается (незвестный идентификатор), а когда переменную объявляю как double всё работает. Но должен же работать и с float.

Добавлено через 1 минуту 9 секунд

Цитата
Сообщение от Vourhey
Посмотреть сообщение

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

Цитата
Сообщение от Katy
Посмотреть сообщение

Пыталась на 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 вот прога

C
1
2
3
4
5
6
7
8
9
#include <iostream.h>
#include <math.h>
void main(void)
{
    float a,b;
    cin>>a;
    b=fabs(a);
    cout<<b<<endl;
}

Добавлено через 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

А жаль..Решила забить код из предыдущего поста- работает, озадачило…

У меня перегрузка операции «-» для объекта окружность

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include "Okr.h"
using namespace std;
const Okr Okr::operator-(const Okr&O)
{
    Okr P(*this);
    P.r=fabs(P.r-O.r);
    return P;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include "Okr.h"
#include <math.h>
using namespace std;
int main(void)
{      
    Okr A,B,C;
A.vvod();
B.vvod();
C=A-B;
A.vivod();
B.vivod();
C.vivod();
return 0;
}

Я уже донельзя все упростила, но пишет- идентификатор не найден Кстати, r у меня double



0



BornLeader

54 / 50 / 9

Регистрация: 16.05.2008

Сообщений: 162

26.03.2010, 14:21

11

Tani,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <math.h>
using namespace std;
 
class Okr
{
public:
  Okr(void){};
  ~Okr(void){};
  void vvod(){ cin >> r;}
  void vivod(){cout << r << endl;}
  const Okr operator-(const Okr&O);
private:
  double r;
};
 
const Okr Okr::operator-(const Okr&O)
{
    Okr P(*this);
        P.r=fabs(P.r-O.r);
        return P;
}
 
int main(void)
{      
  Okr A,B,C;
  A.vvod();
  B.vvod();
  C=A-B;
  A.vivod();
  B.vivod();
  C.vivod();
  return 0;
}

все работает правильно. Уточни что там не так.



0



Tani

25 / 25 / 3

Регистрация: 27.12.2009

Сообщений: 82

26.03.2010, 14:49

12

C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef O_H
#define O_H
class Okr
{
    double x,y,r;
public:
void vivod()const;
void vvod();
const Okr operator-(const Okr&O)
};
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include "o.h"
# define PI 3.1415926
using namespace std;
void Okr::vvod() 
{
    cout<<" Vvedite (x;y) 4erez probel"<<endl;
    cin>>x>>y;
    cout<<"Vvedite radiys"<<endl;
    cin>>r;
    return;
}
void Okr::vivod() const
{
 cout<<"Okryzhnjst'"<< endl<<"Centr("<<x<<"; "<<y<<")   ";
cout<< "radriys= "<< r<<endl;
return;
}
 
 
const Okr Okr::operator-(const Okr&O)
{
    Okr P(*this);
    P.r=fabs(P.r-O.r);
    return P;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include "o.h"
#include <math.h>
using namespace std;
int main(void)
{   
    Okr A,B,C;
A.vvod();
B.vvod();
C=A-B;
A.vivod();
B.vivod();
C.vivod();
return 0;
}

Выложила , ка у меня есть, ваш код нормально компилит, на моем выдает ошибку на fabs, я че-то ваще уже растерялась(((



0



54 / 50 / 9

Регистрация: 16.05.2008

Сообщений: 162

26.03.2010, 15:12

13

Tani, правильно кампилятор ругается: для fabs необходимо подключить math.h ,

#include <math.h> должна находиться в твоем случае не в файле где функция main, а
в файле реализации методов класса Okr, в твоем случае это если я не ошибаюсь o.cpp.

Ну и маленькое замечание: у тебя методы класса vvod и vivod не возвращают никакого значения поэтому конструкция типа


return;

там совсем не к чему.



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

Цитата
Сообщение от Tani
Посмотреть сообщение

просто для функций все в main же подключается?

Подключается только там где это необходимо, в твоем случае у тебя в файле с main

C++
1
2
3
4
#include <iostream> // не надо
#include "o.h"
#include <math.h> // не надо
using namespace std; // не надо

необходимо только
#include «o.h»



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
библиотека cmath.h -> функция abs считает любой тип



1



taras atavin

4203 / 1795 / 211

Регистрация: 24.11.2009

Сообщений: 27,562

17.05.2010, 11:35

19

Кажется так:

C++
1
2
3
4
5
6
7
8
template <class Type> Type abs (Type x)
{
 if (x<0)
 {
  return -x;
 }
 return x;
}



0



Задача сводится к нахождению модуля числа.

Я вижу 2 варианта решения этой задачи.

  1. Использовать функцию abs(), например abs(-5) вернет 5.
  2. Реализовать что-то подобное самостоятельно

[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 для вычисления квадратного корня.

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как на алиэкспресс найти вещь по фото
  • Как составить акт претензию в магазине
  • Ntoskrnl exe ntoskrnl что это за ошибка как исправить
  • Книжка как найти клад
  • Как найти нужный абзац в тексте

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии