-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
math.dart
179 lines (156 loc) · 6.32 KB
/
math.dart
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
// 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:
///
/// import 'dart:math';
///
/// {@category Core}
library dart.math;
part "jenkins_smi_hash.dart";
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 extends num>(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 extends num>(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(b/a)`.
///
/// 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.
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);