commit 892ece05cf5c37b8d56f22d0758026e6b6542293 Author: logaritmisk Date: Sat May 28 22:05:40 2016 +0200 Initial commit. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..af97e22 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,4 @@ +[root] +name = "picomp" +version = "0.1.0" + diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..fed5c52 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "picomp" +version = "0.1.0" +authors = ["logaritmisk "] + +[dependencies] diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..5f7b415 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,97 @@ +fn main() { + println!("{:?}", get_byte(2)); +} + +fn get_byte(id: i32) -> u8 { + let pid : f64 = 4.0 * series(1, id) - 2.0 * series(4, id) - series(5, id) - series(6, id); + + let mut y : f64 = (pid - (pid as i32) as f64 + 1.0).abs(); + + y = 16.0 * (y - y.floor()); + + let first : u8 = y as u8; + + y = 16.0 * (y - y.floor()); + + let second : u8 = y as u8; + + (first << 4) | second +} + + +fn series(m: i32, id: i32) -> f64 { + const EPS : f64 = 1e-17; + + let mut ak : f64; + let mut p : f64; + let mut s : f64 = 0.0; + let mut t : f64; + + for k in 0..id { + ak = (8 * k + m) as f64; + p = (id - k) as f64; + t = expm(p, ak); + s = s + t / ak; + s = s - (s as i32) as f64; + } + + for k in id..id + 101 { + ak = (8 * k + m) as f64; + t = 16f64.powi(id - k) / ak; + + if t < EPS { + break; + } + + s = s + t; + s = s - (s as i32) as f64; + } + + s +} + +fn expm(p: f64, ak: f64) -> f64 { + const NTP : usize = 25; + + let mut tp = vec![1f64; NTP]; + let mut i : i32 = 0; + let mut p1 : f64; + let mut pt : f64; + let mut r : f64; + + for n in 1..NTP { + tp[n] = 2.0 * tp[n - 1]; + } + + if ak == 1.0 { + return 0.0; + } + + for n in 0..NTP { + if tp[n] > p { + i = n as i32; + break; + } + } + + pt = tp[(i - 1) as usize]; + p1 = p; + r = 1.0; + + for _ in 1..i + 1 { + if p1 >= pt { + r = 16.0 * r; + r = r - ((r / ak) as i32) as f64 * ak; + p1 = p1 - pt; + } + + pt = 0.5 * pt; + + if pt >= 1.0 { + r = r * r; + r = r - ((r / ak) as i32) as f64 * ak; + } + } + + r +}