Skip to content

Commit 68839c3

Browse files
bogglemarijnh
authored andcommitted
Added logarithm functions for floats to std::math
Thanks to marijn for helping with #[link_name]
1 parent a6b2a2c commit 68839c3

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

src/lib/math.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ native mod libc {
1010
fn acos(n: float) -> float;
1111
fn tan(n: float) -> float;
1212
fn atan(n: float) -> float;
13+
#[link_name="log"]
14+
fn ln(n: float) -> float;
15+
fn log2(n: float) -> float;
16+
fn log10(n: float) -> float;
17+
fn log1p(n: float) -> float;
1318
}
1419

1520
/*
@@ -81,3 +86,40 @@ Function: max
8186
Returns the maximum of two values
8287
*/
8388
fn max<copy T>(x: T, y: T) -> T { x < y ? y : x }
89+
90+
/*
91+
Const: e
92+
93+
Euler's number
94+
*/
95+
const e: float = 2.718281828459045235;
96+
97+
/*
98+
Function: ln
99+
100+
Returns the natural logaritm
101+
*/
102+
fn ln(n: float) -> float { libc::ln(n) }
103+
104+
/*
105+
Function: log2
106+
107+
Returns the logarithm to base 2
108+
*/
109+
fn log2(n: float) -> float { libc::log2(n) }
110+
111+
/*
112+
Function: log2
113+
114+
Returns the logarithm to base 10
115+
*/
116+
fn log10(n: float) -> float { libc::log10(n) }
117+
118+
119+
/*
120+
Function: log1p
121+
122+
Returns the natural logarithm of `1+n` accurately,
123+
even for very small values of `n`
124+
*/
125+
fn ln1p(n: float) -> float { libc::log1p(n) }

src/test/stdtest/math.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std;
22
import std::math::*;
3+
import std::float;
34

45
#[test]
56
fn test_sqrt() {
@@ -32,3 +33,41 @@ fn test_angle() {
3233
assert angle((1f, 1f)) == 0.25 * pi;
3334
assert angle((0f, 1f)) == 0.5 * pi;
3435
}
36+
37+
38+
#[test]
39+
fn test_log_functions() {
40+
assert ln(1.0) == 0.0;
41+
assert log2(1.0) == 0.0;
42+
assert log10(1.0) == 0.0;
43+
44+
assert ln(e) == 1.0;
45+
assert log2(2.0) == 1.0;
46+
assert log10(10.0) == 1.0;
47+
48+
assert ln(e*e*e*e) == 4.0;
49+
assert log2(256.0) == 8.0;
50+
assert log10(1000.0) == 3.0;
51+
52+
assert ln(0.0) == float::neg_infinity;
53+
assert log2(0.0) == float::neg_infinity;
54+
assert log10(0.0) == float::neg_infinity;
55+
56+
assert ln(-0.0) == float::neg_infinity;
57+
assert log2(-0.0) == float::neg_infinity;
58+
assert log10(-0.0) == float::neg_infinity;
59+
60+
assert float::isNaN(ln(-1.0));
61+
assert float::isNaN(log2(-1.0));
62+
assert float::isNaN(log10(-1.0));
63+
64+
assert ln(float::infinity) == float::infinity;
65+
assert log2(float::infinity) == float::infinity;
66+
assert log10(float::infinity) == float::infinity;
67+
68+
assert ln1p(0.0) == 0.0;
69+
assert ln1p(-0.0) == 0.0;
70+
assert ln1p(-1.0) == float::neg_infinity;
71+
assert float::isNaN(ln1p(-2.0f));
72+
assert ln1p(float::infinity) == float::infinity;
73+
}

0 commit comments

Comments
 (0)