// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// Mathematical constants and functions, plus a random number generator. /// /// To use this library in your code: /// ```dart /// import 'dart:math'; /// ``` /// /// ## Random /// [Random] is a generator of [bool], [int] or [double] values. /// ```dart /// var intValue = Random().nextInt(10); // Value is >= 0 and < 10. /// var doubleValue = Random().nextDouble(); // Value is >= 0.0 and < 1.0. /// var boolValue = Random().nextBool(); // true or false, with equal chance. /// ``` /// /// ## Point /// [Point] is a utility class for representing two-dimensional positions. /// ```dart /// var leftTop = const Point(0, 0); /// var rightBottom = const Point(200, 400); /// ``` /// /// ## Rectangle /// [Rectangle] is a class for representing two-dimensional axis-aligned /// rectangles whose properties are immutable. /// /// Create a rectangle spanned by the points. /// ```dart /// var leftTop = const Point(20, 50); /// var rightBottom = const Point(300, 600); /// var rectangle = Rectangle.fromPoints(leftTop, rightBottom); /// print(rectangle.left); // 20 /// print(rectangle.top); // 50 /// print(rectangle.right); // 300 /// print(rectangle.bottom); // 600 /// ``` /// /// Create a rectangle spanned by `(left, top)` and /// `(left+width, top+height)`. /// ```dart /// var rectangle = const Rectangle(20, 50, 300, 600); /// print(rectangle.left); // 20 /// print(rectangle.top); // 50 /// print(rectangle.right); // 320 /// print(rectangle.bottom); // 650 /// ``` /// /// ## MutableRectangle /// [MutableRectangle] is a class for representing two-dimensional axis-aligned /// rectangles with mutable properties. /// /// Create a mutable rectangle spanned by `(left, top)` and /// `(left+width, top+height)`. /// ```dart /// var rectangle = MutableRectangle(20, 50, 300, 600); /// print(rectangle); // Rectangle (20, 50) 300 x 600 /// print(rectangle.left); // 20 /// print(rectangle.top); // 50 /// print(rectangle.right); // 320 /// print(rectangle.bottom); // 650 /// /// // Change rectangle width and height. /// rectangle.width = 200; /// rectangle.height = 100; /// print(rectangle); // Rectangle (20, 50) 200 x 100 /// print(rectangle.left); // 20 /// print(rectangle.top); // 50 /// print(rectangle.right); // 220 /// print(rectangle.bottom); // 150 /// ``` /// /// {@category Core} library dart.math; import "dart:_internal" show SystemHash; part "point.dart"; part "random.dart"; part "rectangle.dart"; /// Base of the natural logarithms. /// /// Typically written as "e". const double e = 2.718281828459045; /// Natural logarithm of 10. /// /// The natural logarithm of 10 is the number such that `pow(E, LN10) == 10`. /// This value is not exact, but it is the closest representable double to the /// exact mathematical value. const double ln10 = 2.302585092994046; /// Natural logarithm of 2. /// /// The natural logarithm of 2 is the number such that `pow(E, LN2) == 2`. /// This value is not exact, but it is the closest representable double to the /// exact mathematical value. const double ln2 = 0.6931471805599453; /// Base-2 logarithm of [e]. const double log2e = 1.4426950408889634; /// Base-10 logarithm of [e]. const double log10e = 0.4342944819032518; /// The PI constant. const double pi = 3.1415926535897932; /// Square root of 1/2. const double sqrt1_2 = 0.7071067811865476; /// Square root of 2. const double sqrt2 = 1.4142135623730951; /// Returns the lesser of two numbers. /// /// Returns NaN if either argument is NaN. /// The lesser of `-0.0` and `0.0` is `-0.0`. /// If the arguments are otherwise equal (including int and doubles with the /// same mathematical value) then it is unspecified which of the two arguments /// is returned. external T min(T a, T b); /// Returns the larger of two numbers. /// /// Returns NaN if either argument is NaN. /// The larger of `-0.0` and `0.0` is `0.0`. If the arguments are /// otherwise equal (including int and doubles with the same mathematical value) /// then it is unspecified which of the two arguments is returned. external T max(T a, T b); /// A variant of [atan]. /// /// Converts both arguments to [double]s. /// /// Returns the angle in radians between the positive x-axis /// and the vector ([b],[a]). /// The result is in the range -PI..PI. /// /// If [b] is positive, this is the same as `atan(a/b)`. /// /// The result is negative when [a] is negative (including when [a] is the /// double -0.0). /// /// If [a] is equal to zero, the vector ([b],[a]) is considered parallel to /// the x-axis, even if [b] is also equal to zero. The sign of [b] determines /// the direction of the vector along the x-axis. /// /// Returns NaN if either argument is NaN. external double atan2(num a, num b); /// Returns [x] to the power of [exponent]. /// /// If [x] is an [int] and [exponent] is a non-negative [int], the result is /// an [int], otherwise both arguments are converted to doubles first, and the /// result is a [double]. /// /// For integers, the power is always equal to the mathematical result of `x` to /// the power `exponent`, only limited by the available memory. /// /// For doubles, `pow(x, y)` handles edge cases as follows: /// /// - if `y` is zero (0.0 or -0.0), the result is always 1.0. /// - if `x` is 1.0, the result is always 1.0. /// - otherwise, if either `x` or `y` is NaN, then the result is NaN. /// - if `x` is negative (but not -0.0) and `y` is a finite non-integer, the /// result is NaN. /// - if `x` is Infinity and `y` is negative, the result is 0.0. /// - if `x` is Infinity and `y` is positive, the result is Infinity. /// - if `x` is 0.0 and `y` is negative, the result is Infinity. /// - if `x` is 0.0 and `y` is positive, the result is 0.0. /// - if `x` is -Infinity or -0.0 and `y` is an odd integer, then the result is /// `-pow(-x ,y)`. /// - if `x` is -Infinity or -0.0 and `y` is not an odd integer, then the result /// is the same as `pow(-x , y)`. /// - if `y` is Infinity and the absolute value of `x` is less than 1, the /// result is 0.0. /// - if `y` is Infinity and `x` is -1, the result is 1.0. /// - if `y` is Infinity and the absolute value of `x` is greater than 1, /// the result is Infinity. /// - if `y` is -Infinity, the result is `1/pow(x, Infinity)`. /// /// This corresponds to the `pow` function defined in the IEEE Standard /// 754-2008. /// /// Notice that the result may overflow. If integers are represented as 64-bit /// numbers, an integer result may be truncated, and a double result may /// overflow to positive or negative [double.infinity]. external num pow(num x, num exponent); /// Converts [radians] to a [double] and returns the sine of the value. /// /// If [radians] is not a finite number, the result is NaN. external double sin(num radians); /// Converts [radians] to a [double] and returns the cosine of the value. /// /// If [radians] is not a finite number, the result is NaN. external double cos(num radians); /// Converts [radians] to a [double] and returns the tangent of the value. /// /// The tangent function is equivalent to `sin(radians)/cos(radians)` and may be /// infinite (positive or negative) when `cos(radians)` is equal to zero. /// If [radians] is not a finite number, the result is NaN. external double tan(num radians); /// Converts [x] to a [double] and returns its arc cosine in radians. /// /// Returns a value in the range 0..PI, or NaN if [x] is outside /// the range -1..1. external double acos(num x); /// Converts [x] to a [double] and returns its arc sine in radians. /// /// Returns a value in the range -PI/2..PI/2, or NaN if [x] is outside /// the range -1..1. external double asin(num x); /// Converts [x] to a [double] and returns its arc tangent in radians. /// /// Returns a value in the range -PI/2..PI/2, or NaN if [x] is NaN. external double atan(num x); /// Converts [x] to a [double] and returns the positive square root of the /// value. /// /// Returns -0.0 if [x] is -0.0, and NaN if [x] is otherwise negative or NaN. /// ```dart /// var result = sqrt(9.3); /// print(result); // 3.0495901363953815 /// result = sqrt(2); /// print(result); // 1.4142135623730951 /// result = sqrt(0); /// print(result); // 0.0 /// result = sqrt(-2.2); /// print(result); // NaN /// ``` external double sqrt(num x); /// Converts [x] to a [double] and returns the natural exponent, [e], /// to the power [x]. /// /// Returns NaN if [x] is NaN. external double exp(num x); /// Converts [x] to a [double] and returns the natural logarithm of the value. /// /// Returns negative infinity if [x] is equal to zero. /// Returns NaN if [x] is NaN or less than zero. external double log(num x);