Initial commit.
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/target/
|
||||||
4
Cargo.lock
generated
Normal file
4
Cargo.lock
generated
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
[root]
|
||||||
|
name = "picomp"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "picomp"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["logaritmisk <anders.e.olsson@gmail.com>"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
97
src/main.rs
Normal file
97
src/main.rs
Normal file
@@ -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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user