Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. pub mod uncval {
  2. use num::traits::Float;
  3.  
  4. pub trait UncertainValue<T: Float> {
  5. fn as_ab(self) -> AbUncVal<T>;
  6. fn as_rel(self) -> RelUncVal<T>;
  7. }
  8.  
  9. pub struct UncVal;
  10.  
  11. #[derive(Copy, Clone)]
  12. pub struct AbUncVal<T>
  13. where
  14. T: Float,
  15. {
  16. pub val: T,
  17. pub unc: T,
  18. }
  19.  
  20. #[derive(Copy, Clone)]
  21. pub struct RelUncVal<T>
  22. where
  23. T: Float,
  24. {
  25. pub val: T,
  26. pub unc: T,
  27. }
  28.  
  29. impl UncVal {
  30. pub fn ab<T: Float>(val: T, unc: T) -> AbUncVal<T> {
  31. AbUncVal { val, unc }
  32. }
  33.  
  34. pub fn rel<T: Float>(val: T, unc: T) -> RelUncVal<T> {
  35. RelUncVal { val, unc }
  36. }
  37. }
  38.  
  39. impl<T: Float> UncertainValue<T> for AbUncVal<T> {
  40. fn as_ab(self) -> AbUncVal<T> {
  41. self
  42. }
  43.  
  44. fn as_rel(self) -> RelUncVal<T> {
  45. RelUncVal {
  46. val: self.val,
  47. unc: self.unc / self.val,
  48. }
  49. }
  50. }
  51.  
  52. impl<T: Float> UncertainValue<T> for RelUncVal<T> {
  53. fn as_ab(self) -> AbUncVal<T> {
  54. AbUncVal {
  55. val: self.val,
  56. unc: self.val * self.unc,
  57. }
  58. }
  59.  
  60. fn as_rel(self) -> RelUncVal<T> {
  61. self
  62. }
  63. }
  64.  
  65. #[cfg(test)]
  66. mod tests {
  67. use super::*;
  68.  
  69. #[test]
  70. fn test_ab_constructor() {
  71. let u = UncVal::ab(10.0f64, 1.0);
  72. assert_eq!(u.val, 10.0);
  73. assert_eq!(u.unc, 1.0);
  74. }
  75.  
  76. #[test]
  77. fn test_rel_constructor() {
  78. let u = UncVal::rel(10.0f64, 0.1);
  79. assert_eq!(u.val, 10.0);
  80. assert_eq!(u.unc, 0.1);
  81. }
  82. }
  83. }
  84.  
  85. pub mod uncvec {
  86. use num::traits::Float;
  87.  
  88. pub struct UncVec;
  89.  
  90. pub struct AbUncVec<T>
  91. where
  92. T: Float,
  93. {
  94. pub vals: Vec<T>,
  95. pub unc: T,
  96. }
  97.  
  98. pub struct RelUncVec<T>
  99. where
  100. T: Float,
  101. {
  102. pub vals: Vec<T>,
  103. pub unc: T,
  104. }
  105.  
  106. impl UncVec {
  107. pub fn ab<T: Float>(vals: Vec<T>, unc: T) -> AbUncVec<T> {
  108. AbUncVec { vals, unc }
  109. }
  110.  
  111. pub fn rel<T: Float>(vals: Vec<T>, unc: T) -> RelUncVec<T> {
  112. RelUncVec { vals, unc }
  113. }
  114. }
  115.  
  116. #[cfg(test)]
  117. mod tests {
  118. use super::*;
  119.  
  120. #[test]
  121. fn test_ab_constructor() {
  122. let v = vec![1.0f64, 2.0, 3.0];
  123. let uv = UncVec::ab(v.clone(), 0.1);
  124. assert_eq!(uv.vals, v);
  125. assert_eq!(uv.unc, 0.1);
  126. }
  127.  
  128. #[test]
  129. fn test_rel_constructor() {
  130. let v = vec![1.0f64, 2.0, 3.0];
  131. let uv = UncVec::rel(v.clone(), 0.1);
  132. assert_eq!(uv.vals, v);
  133. assert_eq!(uv.unc, 0.1);
  134. }
  135. }
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement