Нюансы работы с вещественными числами
Содержание:
- Введение в range()
- Функции с произвольным числом аргументов
- C++ Tutorial
- 浏览器兼容性
- Описание
- 示例
- Проверка: isFinite и isNaN
- JavaScript-математика, округление до двух знаков после запятой (9)
- 8.5* Интересный факт о strictfp
- Арифметические функции в Python
- Объект Math. Математические операции
- Remarks
- Ceiling(Decimal)
- Ceiling(Double)
- Other Math Functions
- C++ Exercises
Введение в range()
Итак, как работает функция Python под названием range? Простыми словами, range() позволяет вам генерировать ряд чисел в рамках заданного диапазона. В зависимости от того, как много аргументов вы передаете функции, вы можете решить, где этот ряд чисел начнется и закончится, а также насколько велика разница будет между двумя числами.
Вот небольшой пример range() в действии:
Python
for i in range(3, 16, 3):
quotient = i / 3
print(f»{i} делится на 3, результат {int(quotient)}.»)
1 |
foriinrange(3,16,3) quotient=i3 print(f»{i} делится на 3, результат {int(quotient)}.») |
В этом цикле вы просто можете создать ряд чисел, кратных трем, так что вам не нужно вводить каждое из них лично.
Например, следующее использование range() едва ли можно назвать Питоническим (это плохой пример):
Python
captains =
for i in range(len(captains)):
print(captains)
1 |
captains=’Janeway’,’Picard’,’Sisko’ foriinrange(len(captains)) print(captainsi) |
range() отлично подходит для создания повторяющихся чисел, но это не самый лучший выбор, если вам нужно перебрать данные, которые могут быть зациклены с помощью оператора in.
Есть три способа вызова range():
- range(стоп) берет один аргумент
- range(старт, стоп) берет два аргумента
- range(старт, стоп, шаг) берет три аргумента
Вызывая range() с одним аргументом, вы получите ряд чисел, начинающихся с 0 и включающих каждое число до, но не включая число, которое вы обозначили как конечное (стоп).
Как это выглядит на практике:
Python
for i in range(3):
print(i)
1 |
foriinrange(3) print(i) |
Выдача вашего цикла будет выглядеть так:
Python
0
1
2
1 |
1 |
Проверим: у нас есть все числа от 0 до, но не включая 3 — числа, которое вы указали как конечное.
range(старт, стоп)
Вызывая range() с двумя аргументами, вам нужно решить не только, где ряд чисел должен остановиться, но и где он должен начаться, так что вам не придется начинать с нуля каждый раз. Вы можете использовать range() для генерации ряда чисел, начиная с А до Б, используя диапазон (А, Б). Давайте узнаем, как генерировать диапазон, начинающийся с 1.
Попробуем вызывать range() с двумя аргументами:
Python
for i in range(1, 8):
print(i)
1 |
foriinrange(1,8) print(i) |
Ваша выдача будет выглядеть следующим образом:
Python
1
2
3
4
5
6
7
1 |
1 2 3 4 5 6 7 |
Отлично: у вас есть все числа от 1 (число, которые вы определили как стартовое), до, но не включая, 8 (число, которые вы определили как конечное).
Но если вы добавите еще один аргумент, то вы сможете воспроизвести ранее полученный результат, когда пользуетесь списком под названием numbers_divisible_by_three.
range(старт, стоп, шаг)
Вызывая range() с тремя аргументами, вы можете выбрать не только то, где ряд чисел начнется и остановится, но также то, на сколько велика будет разница между одним числом и следующим. Если вы не задаете этот «шаг», то range() автоматически будет вести себя так, как если бы шаг был бы равен 1.
Обратите внимание: шаг может быть положительным, или отрицательным числом, но он не может равняться нулю:
Python
>>> range(1, 4, 0)
Traceback (most recent call last):
File «<stdin>», line 1, in <module>
ValueError: range() arg 3 must not be zero
1 |
>>>range(1,4,) Traceback(most recent call last) File»<stdin>»,line1,in<module> ValueErrorrange()arg3must notbe zero |
Если вы попробуете использовать 0 как шаг, вы получите ошибку ValueError.
Теперь, так как вы знаете, как использовать шаг, вы можете снова использовать цикл, который мы видели ранее, с числами, кратными 3.
Попробуйте лично:
Python
for i in range(3, 16, 3):
quotient = i / 3
print(f»{i} делится на 3, результат {int(quotient)}.»)
1 |
foriinrange(3,16,3) quotient=i3 print(f»{i} делится на 3, результат {int(quotient)}.») |
Ваша выдача будет выглядеть абсолютно так же, как выдача для цикла for, которую мы видели ранее в данном руководстве, когда мы использовали список numbers_divisible_by_three:
Python
3 делится на 3, результат 1.
6 делится на 3, результат 2.
9 делится на 3, результат 3.
12 делится на 3, результат 4.
15 делится на 3, результат 5.
1 |
3делитсяна3,результат1. 6делитсяна3,результат2. 9делитсяна3,результат3. 12делитсяна3,результат4. 15делитсяна3,результат5. |
Как вы видите в этом примере, вы можете использовать аргумент шаг для увеличения в сторону больших чисел. Это называется инкрементация.
Функции с произвольным числом аргументов
Для начала
вспомним, что когда мы говорили о кортежах, то указывали на такую работу
оператора присваивания:
x,y = (1,2)
Здесь x и y принимают
значения 1 и 2 соответственно. Но когда этих значений было больше, чем
переменных:
x,y = (1,2,3,4)
то возникала
ошибка. Так вот, смотрите, если поставить оператор *, например, перед y, то ошибки не
возникнет:
x,*y = (1,2,3,4)
и переменная x = 1, а y = . То
есть, во вторую переменную будут записаны все оставшиеся значения в виде
списка. Или же, можно сделать так:
*x,y = (1,2,3,4)
Тогда первые три
значения будут помещены в x:
x =
а последнее в y: y = 4. То же
самое работает и со списками:
x,*y = 1,"a",True,4
и со строками:
*x, y, z = "Hello world!"
И вообще с
любыми перечисляемыми типами данных. То есть, оператор * упаковывает оставшиеся
значения в список. Правда, мы не можем упаковывать уже упакованные данные,
например, так:
*y = 1,2,3
произойдет
ошибка, но вот так:
x, *y = 1,2,3
будет работать.
Этот же оператор
может выполнять и обратную операцию – распаковывать списки в набор данных. Смотрите,
предположим, мы описываем, что счетчик в цикле for должен пробегать
диапазон от -5 до 5 с шагом 1. Как вы уже знаете, это делается так:
for x in range(-5,6): print(x, end=" ")
Далее, мы хотим
представить этот диапазон с помощью списка:
a = -5, 6
и передать его
функции range. Если записать
просто a:
for x in range(a):
То возникнет
ошибка, т.к. функция ожидает числа, а не список. Но, записав * перед переменной
a, произойдет
распаковка списка в набор из двух чисел: -5 и 6:
for x in range(*a):
и программа
сработает без ошибок. Тогда как узнать: когда этот оператор распаковывает
данные, а когда запаковывает? Очень просто:
-
Если
выполняется присвоение данных переменной с оператором *, то данные
упаковываются. Например, *y, x = 1,2,3. - Если
выполняется передача списка с указанием оператора *, то происходит его распаковка.
Например, range(*).
Этот оператор
можно использовать для объявления функций с произвольным числом аргументов:
def myFunc(*args): print(args)
и вызовем ее:
myFunc() myFunc(1) myFunc(1, 2) myFunc(1, 3, "hello")
Смотрите, у нас args становится
кортежем с переданными значениями при вызове функции. Значит, мы спокойно можем
перебрать все значения кортежа, например, в цикле for:
def myFunc(*args): for arg in args: print(arg) myFunc(1, 3, "hello")
В результате
получили функцию с произвольным числом аргументов. Где это может пригодиться?
Например, реализовать универсальную функцию для вычисления суммы переданных
элементов:
def mySum(*args): S = for arg in args: S += arg return S print( mySum(1,2,3,4,5) )
А что если мы
хотим передавать функции неограниченное количество именованных аргументов? Вот
так:
myFunc(arg1=1, arg2=2, arg3=3)
В этом случае
аргумент у функции следует записать с двумя звездочками:
def myFunc(**kwargs): print(kwargs)
И при ее вызове
мы видим, что kwargs – это словарь. Как
перебирать элементы словаря мы уже знаем, например, можно сделать так:
def myFunc(**kwargs): for name, value in kwargs.items(): print(name, value)
и далее,
выполняем определенные действия в зависимости от значений именованных
аргументов.
Но, если мы
теперь попытаемся вызвать функцию вот так:
myFunc(1,2,3, arg1=1, arg2=2, arg3=3)
то возникнет
ошибка, т.к. первые три аргумента не именованные. Для такого варианта вызовов
функцию myFunc следует записать
так:
def myFunc(*args, **kwargs): print(args) print(kwargs)
Причем, вот эти
неименованные аргументы должны всегда следовать перед именованными. Или же
можно сделать так:
def myFunc(*args, sep="sep", end="end", **kwargs): print(args) print(kwargs) print(sep, end)
или так:
def myFunc(x, y, *args, sep="sep", end="end", **kwargs): print(args) print(kwargs) print(x, y) print(sep, end)
Все эти
комбинации вполне допустимы, главное чтобы их порядок был именно таким: сначала
фактические параметры, затем необязательный список args, затем
формальные параметры и потом список этих параметров.
C++ Tutorial
C++ HOMEC++ IntroC++ Get StartedC++ SyntaxC++ Output
Print Text
New Lines
C++ CommentsC++ Variables
Declare Variables
Declare Multiple Variables
Identifiers
Constants
C++ User InputC++ Data Types
Basic Data Types
Numbers
Booleans
Characters
Strings
C++ Operators
Arithmetic
Assignment
Comparison
Logical
C++ Strings
Strings
Concatenation
Numbers and Strings
String Length
Access Strings
User Input Strings
Omitting Namespace
C++ MathC++ Booleans
Boolean Values
Boolean Expressions
C++ Conditions
if
else
else if
Short hand if..else
C++ SwitchC++ While Loop
While Loop
Do/While Loop
C++ For LoopC++ Break/ContinueC++ Arrays
Arrays
Arrays and Loops
Omit Array Size
C++ References
Create References
Memory Address
C++ Pointers
Create Pointers
Dereferencing
Modify Pointers
浏览器兼容性
The compatibility table in this page is generated from structured data. If you’d like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Update compatibility data on GitHub
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome for Android | Firefox for Android | Opera for Android | Safari on iOS | Samsung Internet | Node.js | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome Full support 1 |
Edge Full support 12 |
Firefox Full support 1 |
IE Full support 3 |
Opera Full support 3 |
Safari Full support 1 |
WebView Android Full support 1 |
Chrome Android Full support 18 |
Firefox Android Full support 4 |
Opera Android Full support 10.1 |
Safari iOS Full support 1 |
Samsung Internet Android Full support 1.0 |
nodejs Full support 0.1.100 |
Описание
Объявление переменной всегда обрабатывается до выполнения кода, где бы она ни находилась. Область видимости переменной, объявленной через , это её текущий контекст выполнения. Который может ограничиваться функцией или быть глобальным, для переменных, объявленных за пределами функции.
Присвоение значения необъявленной переменной подразумевает, что она будет создана как глобальная переменная (переменная становится свойством глобального объекта) после выполнения присваивания значения. Различия между объявленной и необъявленной переменными следующие:
1. Объявленные переменные ограничены контекстом выполнения, в котором они были объявлены. Необъявленные переменные всегда глобальны.
function x() { y = 1; // возбудит ReferenceError в "строгом режиме" var z = 2; } x(); console.log(y); // выведет "1" console.log(z); // возбудит ReferenceError: z не определён вне x
2. Объявленные переменные инициализируются до выполнения любого кода. Необъявленные переменные не существуют до тех пор, пока к ним не выполнено присваивание.
console.log(a); // Возбудит ReferenceError. console.log('still going...'); // Не выполнится.
var a; console.log(a); // Выведет "undefined" или "", в зависимости от браузера. console.log('still going...'); // Выведет "still going...".
3. Объявленные переменные, независимо от контекста выполнения, являются ненастраиваемыми свойствами. Необъявленные переменные это настраиваемые свойства (т.е. их можно удалять).
var a = 1; b = 2; delete this.a; // Возбудит TypeError в "строгом режиме". В "нестрогом режиме" будет ошибка без уведомления. delete this.b; console.log(a, b); // Возбудит ReferenceError. // Свойство 'b' было удалено и больше не существует.
Из-за перечисленных различий, использование необъявленных переменных может привести к непредсказуемым последствиям. Рекомендовано всегда объявлять переменные, вне зависимости, находятся они внутри функции или в глобальном контексте. Присваивание значения необъявленной переменной в строгом режиме ECMAScript 5 возбуждает ошибку.
Поднятие переменных
Объявление переменных (как и любые другие объявления) обрабатываются до выполнения кода. Где бы не находилось объявление, это равнозначно тому, что переменную объявили в самом начале кода. Это значит, что переменная становится доступной до того, как она объявлена. Такое поведение называется «поднятием» (в некоторых источниках «всплытием»).
bla = 2 var bla; // ... // читается как: var bla; bla = 2;
Поэтому объявление переменных рекомендовано выносить в начало их области видимости (в начало глобального кода или в начало функции). Это даёт понять какие переменные принадлежат функции (т.е. являются локальными), а какие обрабатываются в цепи областей видимости (т.е. являются глобальными).
Важно отметить, что подъем будет влиять на объявление переменной, но не на инициализацию ее значения. Значение присваивается при выполнении оператора присваивания:
function do_something() { console.log(bar); // выведет undefined var bar = 111; console.log(bar); // выведет 111 } // ...неявно понимается как: function do_something() { var bar; console.log(bar); // выведет undefined bar = 111; console.log(bar); // выведет 111 }
示例
例子:使用
Math.floor( 45.95); // 45 Math.floor( 45.05); // 45 Math.floor( 4 ); // 4 Math.floor(-45.05); // -46 Math.floor(-45.95); // -46
例子:十进制调整
// Closure (function(){ /** * Decimal adjustment of a number. * * @param {String} type The type of adjustment. * @param {Number} value The number. * @param {Integer} exp The exponent (the 10 logarithm of the adjustment base). * @returns {Number} The adjusted value. */ function decimalAdjust(type, value, exp) { // If the exp is undefined or zero... if (typeof exp === 'undefined' || +exp === 0) { return Math(value); } value = +value; exp = +exp; // If the value is not a number or the exp is not an integer... if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) { return NaN; } // Shift value = value.toString().split('e'); value = Math(+(value + 'e' + (value ? (+value - exp) : -exp))); // Shift back value = value.toString().split('e'); return +(value + 'e' + (value ? (+value + exp) : exp)); } // Decimal round if (!Math.round10) { Math.round10 = function(value, exp) { return decimalAdjust('round', value, exp); }; } // Decimal floor if (!Math.floor10) { Math.floor10 = function(value, exp) { return decimalAdjust('floor', value, exp); }; } // Decimal ceil if (!Math.ceil10) { Math.ceil10 = function(value, exp) { return decimalAdjust('ceil', value, exp); }; } })(); // Round Math.round10(55.55, -1); // 55.6 Math.round10(55.549, -1); // 55.5 Math.round10(55, 1); // 60 Math.round10(54.9, 1); // 50 Math.round10(-55.55, -1); // -55.5 Math.round10(-55.551, -1); // -55.6 Math.round10(-55, 1); // -50 Math.round10(-55.1, 1); // -60 // Floor Math.floor10(55.59, -1); // 55.5 Math.floor10(59, 1); // 50 Math.floor10(-55.51, -1); // -55.6 Math.floor10(-51, 1); // -60 // Ceil Math.ceil10(55.51, -1); // 55.6 Math.ceil10(51, 1); // 60 Math.ceil10(-55.59, -1); // -55.5 Math.ceil10(-59, 1); // -50
Проверка: isFinite и isNaN
Помните эти специальные числовые значения?
- (и ) — особенное численное значение, которое ведёт себя в точности как математическая бесконечность ∞.
- представляет ошибку.
Эти числовые значения принадлежат типу , но они не являются «обычными» числами, поэтому есть функции для их проверки:
-
преобразует значение в число и проверяет является ли оно :
Нужна ли нам эта функция? Разве не можем ли мы просто сравнить ? К сожалению, нет. Значение уникально тем, что оно не является равным ни чему другому, даже самому себе:
-
преобразует аргумент в число и возвращает , если оно является обычным числом, т.е. не :
Иногда используется для проверки, содержится ли в строке число:
Помните, что пустая строка интерпретируется как во всех числовых функциях, включая.
Сравнение
Существует специальный метод Object.is, который сравнивает значения примерно как , но более надёжен в двух особых ситуациях:
- Работает с : , здесь он хорош.
- Значения и разные: , это редко используется, но технически эти значения разные.
Во всех других случаях идентичен .
Этот способ сравнения часто используется в спецификации JavaScript. Когда внутреннему алгоритму необходимо сравнить 2 значения на предмет точного совпадения, он использует (Определение ).
JavaScript-математика, округление до двух знаков после запятой (9)
У меня есть следующий синтаксис JavaScript:
Var discount = Math.round(100 — (price / listprice) * 100);
Это округляется до целого числа. Как я могу вернуть результат с двумя десятичными знаками?
Вот рабочий пример
Var value=200.2365455;
result=Math.round(value*100)/100 //result will be 200.24
Для обработки округления до любого количества десятичных знаков для большинства потребностей будет достаточно функции с 2 строками кода. Вот пример кода для игры.
Var testNum = 134.9567654;
var decPl = 2;
var testRes = roundDec(testNum,decPl);
alert (testNum + » rounded to » + decPl + » decimal places is » + testRes);
function roundDec(nbr,dec_places){
var mult = Math.pow(10,dec_places);
return Math.round(nbr * mult) / mult;
}
Лучшее и простое решение, которое я нашел, это
Function round(value, decimals) {
return Number(Math.round(value+»e»+decimals)+»e-«+decimals);
}
round(1.005, 2); // 1.01
Небольшая вариация принятого ответа. toFixed(2) возвращает строку, и вы всегда получите два десятичных знака. Это могут быть нули. Если вы хотите подавить конечный ноль (ы), просто выполните это:
Var discount = + ((price / listprice).toFixed(2));
Отредактировано: Я только что обнаружил, что кажется ошибкой в Firefox 35.0.1, а это означает, что приведенное выше может дать NaN некоторые значения. Я изменил свой код на
Var discount = Math.round(price / listprice * 100) / 100;
Это дает число с точностью до двух знаков после запятой. Если вам нужно три, вы будете умножать и делить на 1000, и так далее. OP хочет два десятичных разряда всегда, но если toFixed () нарушено в Firefox, сначала нужно зафиксировать его. См. https://bugzilla.mozilla.org/show_bug.cgi?id=1134388
Чтобы получить результат с двумя десятичными знаками, вы можете сделать следующее:
Var discount = Math.round((100 — (price / listprice) * 100) * 100) / 100;
Значение, которое нужно округлить, умножается на 100, чтобы сохранить первые две цифры, затем мы делим на 100, чтобы получить фактический результат.
Я думаю, что лучший способ, который я видел, это умножить на 10 на количество цифр, затем сделать Math.round, а затем, наконец, делить на 10 на количество цифр. Вот простая функция, которую я использую в машинописных текстах:
Function roundToXDigits(value: number, digits: number) {
value = value * Math.pow(10, digits);
value = Math.round(value);
value = value / Math.pow(10, digits);
return value;
}
Или простой javascript:
Function roundToXDigits(value, digits) {
if(!digits){
digits = 2;
}
value = value * Math.pow(10, digits);
value = Math.round(value);
value = value / Math.pow(10, digits);
return value;
}
ПРИМЕЧАНИЕ. — См. Редактировать 4, если важна 3-значная точность.
Var discount = (price / listprice).toFixed(2);
toFixed округляется вверх или вниз для вас в зависимости от значений, превышающих 2 десятичных знака.
Изменить.
Как упоминалось другими, это преобразует результат в строку. Чтобы избежать этого:
Var discount = +((price / listprice).toFixed(2));
Требуется одна незначительная модификация, но функция в ответе, указанном выше, возвращает целые числа, когда она округляется до одной, поэтому, например, 99.004 вернет 99 вместо 99,00, что не идеально подходит для отображения цен.
Edit 3
— Кажется, что toFixed на фактическом возврате STILL закручивал некоторые цифры, это окончательное редактирование, похоже, работает. Geez так много репараций!
Var discount = roundTo((price / listprice), 2);
function roundTo(n, digits) {
if (digits === undefined) {
digits = 0;
}
var multiplicator = Math.pow(10, digits);
n = parseFloat((n * multiplicator).toFixed(11));
var test =(Math.round(n) / multiplicator);
return +(test.toFixed(digits));
}
Редактировать 4
— Вы, ребята, меня убиваете. Edit 3 терпит неудачу на отрицательных числах, не копаясь в том, почему проще просто сделать отрицательное число положительным, прежде чем делать округление, а затем вернуть его обратно, прежде чем возвращать результат.
Function roundTo(n, digits) {
var negative = false;
if (digits === undefined) {
digits = 0;
}
if(n
Самый быстрый путь
— быстрее, чем toFixed ():
8.5* Интересный факт о strictfp
В Java есть специальное ключевое слово (strict floating point), которого нет в других языках программирования. И знаете? зачем оно нужно? Оно ухудшает точность работы с вещественными числами. История его появления примерно такова:
Создатели Java:
Мы очень хотим, чтобы Java была суперпопулярна, и программы на Java выполнялись на как можно большем количестве устройств. Поэтому мы прописали в спецификацию Java-машины, что на всех типах устройств все программы должны выполняться одинаково!
Создатели процессора Intel:
Ребята, мы улучшили наши процессоры? и теперь все вещественные числа внутри процессора будет представлены не 8-ю, а 10-ю байтами. Больше байт — больше знаковых цифр. А это значит что? Правильно: теперь ваши научные вычисления будут еще более точными!
Ученые и все, кто занимается сверхточными расчетами:
Круто! Молодцы. Отличная новость.
Создатели Java:
Не-не-не, ребята. Мы же сказали: все Java-программы должны выполняться одинаково на всех устройствах. Принудительно выключем возможность использования 10 байтовых вещественных чисел внутри процессоров Intel.
Вот теперь все опять отлично! Не благодарите.
Ученые и все, кто занимается сверхточными расчетами:
Да вы там совсем охренели? Ану быстро вернули все как было!
Создатели Java:
Ребята, это для вашей же пользы! Только представьте: все Java-программы выполняются одинаково на всех устройствах. Ну круто же!
Ученые и все, кто занимается сверхточными расчетами:
Нет. Совсем не круто. Ану быстро вернули все обратно. Или мы вашу Java вам знаете куда засунем?
Создатели Java:
Гм. Что же вы сразу не сказали. Конечно, вернем.
Вернули возможность пользоваться всеми фичами крутых процессоров.
Кстати. Мы так же специально добавили в язык слово : если его написать перед именем функции, вся работа с вещественными числами внутри этой функции будет одинаково плохой на всех устройствах!
Арифметические функции в Python
Арифметические функции используются для представления чисел в различных формах и осуществления над ними математических операций. Далее представлен перечень самых популярных арифметических функций:
- : округление определенного числа вверх;
- : возвращает модуль (абсолютное значение) указанного числа;
- : округление определенного числа вниз;
- : получение наибольшего общего делителя чисел и ;
- : возвращает сумму всех элементов итерируемого объекта;
- : возвращает (e^x)-1;
- : когда значение слишком мало, вычисление может привести к значительной потери в точности. может вернуть вывод с полной точностью.
В следующем примере показано использование перечисленных выше функций:
Python
import math
num = -4.28
a = 14
b = 8
num_list =
x = 1e-4 # Малое значение x
print(‘Число:’, num)
print(‘Округление числа вниз:’, math.floor(num))
print(‘Округление числа вверх:’, math.ceil(num))
print(‘Модуль числа:’, math.fabs(num))
print(‘Наибольший общий делитель a и b: ‘ + str(math.gcd(a, b)))
print(‘Сумма элементов списка: ‘ + str(math.fsum(num_list)))
print(‘e^x (при использовании функции exp()) равно:’, math.exp(x)-1)
print(‘e^x (при использовании функции expml()) равно:’, math.expm1(x))
1 |
importmath num=-4.28 a=14 b=8 num_list=10,8.25,75,7.04,-86.23,-6.43,8.4 x=1e-4# Малое значение x print(‘Число:’,num) print(‘Округление числа вниз:’,math.floor(num)) print(‘Округление числа вверх:’,math.ceil(num)) print(‘Модуль числа:’,math.fabs(num)) print(‘Наибольший общий делитель a и b: ‘+str(math.gcd(a,b))) print(‘Сумма элементов списка: ‘+str(math.fsum(num_list))) print(‘e^x (при использовании функции exp()) равно:’,math.exp(x)-1) print(‘e^x (при использовании функции expml()) равно:’,math.expm1(x)) |
Вывод
Python
Число: -4.28
Округление числа вниз: -5
Округление числа вверх: -4
Модуль числа: 4.28
Наибольший общий делитель a и b: 2
Сумма элементов списка: 16.029999999999998
e^x (при использовании функции exp()) равно: 0.0001000050001667141
e^x (при использовании функции expml()) равно: 0.00010000500016667084
1 |
Число-4.28 Округлениечиславниз-5 Округлениечиславверх-4 Модульчисла4.28 Наибольшийобщийделительaиb2 Суммаэлементовсписка16.029999999999998 e^x(прииспользованиифункцииexp())равно0.0001000050001667141 e^x(прииспользованиифункцииexpml())равно0.00010000500016667084 |
К числу других математических функций относятся:
- : принимает два вещественных аргумента, возводит первый аргумент в степень, значением которой является второй аргумент, после чего возвращает результат. К примеру, эквивалентно выражению ;
- : возвращает квадратный корень определенного числа.
Примеры данных методов представлены ниже:
Возведение в степень
Python
math.pow(3, 4)
1 | math.pow(3,4) |
Вывод
Shell
81.0
1 | 81.0 |
Квадратный корень
Python
math.sqrt(81)
1 | math.sqrt(81) |
Вывод
Shell
9.0
1 | 9.0 |
Объект Math. Математические операции
Последнее обновление: 1.11.2015
Объект Math предоставляет ряд математических функций, которые можно использовать при вычислениях. Рассмотрим основные математические функции.
abs()
Функция возвращает абсолютное значение числа:
var x = -25; document.write(Math.abs(x)); // 25 var y = 34; document.write(Math.abs(y)); // 34
min() и max()
Функции и возвращают соответственно минимальное и максимальное значение из набора чисел:
var max = Math.max(19, 45); // 45 var min = Math.min(33, 24); // 24
Эти функции необязательно должны принимать два числа, в них можно передавать и большее количество чисел:
var max = Math.max(1, 2, 3, -9, 46, -23); // 46
ceil()
Функция округляет число до следующего наибольшего целого числа:
var x = Math.ceil(9.2); // 10 var y = Math.ceil(-5.9); // -5
Выражение возвращает число 10, так как число 10 следующее наибольшее целое число после 9.2. И также
выражение возвращает -5, потому что число -5 следующее наибольшее целое после -5.9
floor()
Функция округляет число до следующего наименьшего целого числа:
var x = Math.floor(9.2); // 9 var y = Math.floor(-5.9); // -6
round()
Функция округляет число до следующего наименьшего целого числа, если его десятичная часть меньше 0.5. Если же десятичная
часть равна или больше 0.5, то округление идет до ближайшего наибольшего целого числа:
var x = Math.round(5.5); // 6 var y = Math.round(5.4); // 5 var z = Math.round(-5.4); // -5 var n = Math.round(-5.5); // -5 var m = Math.round(-5.6); // -6 console.log(x); console.log(y); console.log(z); console.log(n);
Функция возвращает случайное число с плавающей точкой их диапазона от 0 до 1:
var x = Math.random();
Функция возвращает число в определенной степени. Например, возведем число 2 в степень 3:
var x = Math.pow(2, 3); // 8
sqrt()
Функция возвращает квадратный корень числа:
var x = Math.sqrt(121); // 11 var y = Math.sqrt(9); // 3 var z = Math.sqrt(20); // 4.47213595499958
Функция возвращает натуральный логарифм числа:
var x = Math.log(1); // 0 var z = Math.log(10); // 2.302585092994046
Тригонометрические функции
Целый ряд функций представляют тригонометрические функции: (вычисляет синус угла),
(вычисляет косинус угла), (вычисляет тангенс угла). В качестве значения они приимают значение в радианах.
var x = Math.sin(Math.PI/2); // 1 var y = Math.cos(0); // 1 var z = Math.tan(Math.PI/4); // 0.9999999999999999 var s = Math.sin(Math.PI/4); // 0.7071067811865476 var c = Math.cos(Math.PI/4); // 0.7071067811865476 console.log(x, y, z, s, c);
Функция вычисляет арксинус числа, — арккосинус, а — арктангенс числа:
var x = Math.asin(0.9); // 1.1197695149986342 var y = Math.acos(1); // 1 var z = Math.atan(1); // 0.7853981633974483
Константы
Кроме методов объект Math также определяет набор встроенных констант, которые можно использовать в различных вычислениях:
-
(число PI): 3.141592653589793
-
(квадратный корень из двух): 1.4142135623730951
-
(половина от квадратного корня из двух): 0.7071067811865476
-
(число e или число Эйлера): 2.718281828459045
-
(натуральный логарифм числа 2): 0.6931471805599453
-
(натуральный логарифм числа 10): 2.302585092994046
-
(двоичный логарифм числа e): 1.4426950408889634
-
(десятичный логарифм числа e): 0.4342944819032518
Используем константы в вычислениях:
var x = Math.log(Math.E); // 1 var z = Math.tan(Math.PI/4); // 0.9999999999999999
НазадВперед
Remarks
The behavior of this method follows IEEE Standard 754, section 4. This kind of rounding is sometimes called rounding toward positive infinity.
Ceiling(Decimal)
Returns the smallest integral value that is greater than or equal to the specified decimal number.
-
d
- Decimal
A decimal number.
Returns
- Decimal
The smallest integral value that is greater than or equal to . Note that this method returns a Decimal instead of an integral type.
Remarks
The behavior of this method follows IEEE Standard 754, section 4. This kind of rounding is sometimes called rounding toward positive infinity. In other words, if is positive, the presence of any fractional component causes to be rounded to the next highest integer. If is negative, the rounding operation causes any fractional component of to be discarded. The operation of this method differs from the method, which supports rounding toward negative infinity.
- Round
Ceiling(Double)
Returns the smallest integral value that is greater than or equal to the specified double-precision floating-point number.
-
a
- Double
A double-precision floating-point number.
Returns
- Double
The smallest integral value that is greater than or equal to . If is equal to NaN, NegativeInfinity, or PositiveInfinity, that value is returned. Note that this method returns a Double instead of an integral type.
Remarks
The behavior of this method follows IEEE Standard 754, section 4. This kind of rounding is sometimes called rounding toward positive infinity. In other words, if is positive, the presence of any fractional component causes to be rounded to the next highest integer. If is negative, the rounding operation causes any fractional component of to be discarded. The operation of this method differs from the method, which supports rounding toward negative infinity.
Starting with Visual Basic 15.8, the performance of Double-to-integer conversion is optimized if you pass the value returned by the method to the any of the integral conversion functions, or if the Double value returned by is automatically converted to an integer with Option Strict set to Off. This optimization allows code to run faster — up to twice as fast for code that does a large number of conversions to integer types. The following example illustrates such optimized conversions:
- Round
Other Math Functions
A list of other popular Math functions (from the library) can be found in the table below:
Function | Description |
---|---|
abs(x) | Returns the absolute value of x |
acos(x) | Returns the arccosine of x, in radians |
asin(x) | Returns the arcsine of x, in radians |
atan(x) | Returns the arctangent of x, in radians |
cbrt(x) | Returns the cube root of x |
ceil(x) | Returns the value of x rounded up to its nearest integer |
cos(x) | Returns the cosine of x, in radians |
cosh(x) | Returns the hyperbolic cosine of x, in radians |
exp(x) | Returns the value of Ex |
expm1(x) | Returns ex -1 |
fabs(x) | Returns the absolute value of a floating x |
fdim(x, y) | Returns the positive difference between x and y |
floor(x) | Returns the value of x rounded down to its nearest integer |
hypot(x, y) | Returns sqrt(x2 +y2) without intermediate overflow or underflow |
fma(x, y, z) | Returns x*y+z without losing precision |
fmax(x, y) | Returns the highest value of a floating x and y |
fmin(x, y) | Returns the lowest value of a floating x and y |
fmod(x, y) | Returns the floating point remainder of x/y |
pow(x, y) | Returns the value of x to the power of y |
sin(x) | Returns the sine of x (x is in radians) |
sinh(x) | Returns the hyperbolic sine of a double value |
tan(x) | Returns the tangent of an angle |
tanh(x) | Returns the hyperbolic tangent of a double value |