Skip to content

Commit 9b49d8c

Browse files
Remove pow accuracy workaround
neogenie/fastnum#28
1 parent f918f3d commit 9b49d8c

File tree

3 files changed

+9
-15
lines changed

3 files changed

+9
-15
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/evaluator.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,8 @@ mod tests {
299299
assert_eq!(eval_default("-1km to m"), Number::new(d!(-1000), Unit::Meter));
300300
assert_eq!(eval_num("2*-3*0.5"), "-3");
301301
assert_eq!(eval_num("-3^2"), "-9");
302+
assert_eq!(eval_num("e^2"), "7.3890560989306502272304274605750078132");
303+
assert_eq!(eval_num("e^2.5"), "12.1824939607034734380701759511679661832");
302304
assert_eq!(eval_num("-1+2"), "1");
303305
}
304306

src/units.rs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use fastnum::{dec128 as d, D128, D256};
1+
use fastnum::{dec128 as d, D128};
22
use crate::Number;
33

44
#[derive(Clone, Copy, PartialEq, Debug)]
@@ -754,36 +754,28 @@ pub fn modulo(left: Number, right: Number) -> Result<Number, String> {
754754
}
755755
}
756756

757-
fn do_pow(left: D128, right: D128) -> D128 {
758-
// Do pow with d256 for higher accuracy
759-
let left = D256::try_from(left.transmute()).unwrap();
760-
let right = D256::try_from(right.transmute()).unwrap();
761-
let result = left.pow(right);
762-
let result_d128: D128 = result.transmute();
763-
result_d128
764-
}
765-
766757
/// Returns a [`Number`] to the power of another [`Number`]
767758
///
768759
/// - If you take [`Length`] to the power of [`NoType`], the result has a unit of [`Area`].
769760
/// - If you take [`Length`] to the power of [`Length`], the result has a unit of [`Area`]
770761
/// - If you take [`Length`] to the power of [`Area`], the result has a unit of [`Volume`]
771762
/// - etc.
772763
pub fn pow(left: Number, right: Number) -> Result<Number, String> {
764+
// I tried converting `right` to use powi, but somehow that was slower
773765
let lcat = left.unit.category();
774766
let rcat = left.unit.category();
775767
if left.unit == NoUnit && right.unit == NoUnit {
776768
// 3 ^ 2
777-
Ok(Number::new(do_pow(left.value, right.value), left.unit))
769+
Ok(Number::new(left.value.pow(right.value), left.unit))
778770
} else if right.value == d!(1) && right.unit == NoUnit {
779771
Ok(left)
780772
} else if lcat == Length && right.unit == NoUnit && right.value == d!(2) {
781773
// x km ^ 2
782-
let result = do_pow(left.value * left.unit.weight(), right.value);
774+
let result = (left.value * left.unit.weight()).pow(right.value);
783775
Ok(to_ideal_unit(Number::new(result, SquareMillimeter)))
784776
} else if lcat == Length && right.unit == NoUnit && right.value == d!(3) {
785777
// x km ^ 3
786-
let result = do_pow(left.value * left.unit.weight(), right.value);
778+
let result = (left.value * left.unit.weight()).pow(right.value);
787779
Ok(to_ideal_unit(Number::new(result, CubicMillimeter)))
788780
} else if lcat == Length && rcat == Length && right.value == d!(1) {
789781
// x km ^ 1 km

0 commit comments

Comments
 (0)