pub struct GoldschmidtDivision {
pub iterations: u64,
pub denominator_cap_2k: u64,
}Expand description
A structure that defines the custom operation GoldSchmidtDivision that computes division of two numbers via the Goldschmidt method.
In particular, this operation computes an approximation of 2denominator_cap_2k divdend / divisor.
Inputs must be of the scalar type UINT64 or INT64 and be in (0, 2denominator_cap_2k - 1) range. The divisor is also assumed to be small enough (less than 232), otherwise integer overflows are possible, yielding incorrect results.
Optionally, an initial approximation for the Goldschmidt method can be provided. In this case, the operation might be faster and of lower depth, however, it must be guaranteed that 2denominator_cap_2k - 1 <= input * initial_approximation < 2denominator_cap_2k + 1.
§Custom operation arguments
- Node containing an unsigned or signed 64-bit array or scalar as the dividend.
- Node containing an unsigned or signed 64-bit array or scalar as the divisor.
- Negative values are currently unsupported as sign extraction is quite expensive
- (optional) Node containing an array or scalar that serves as an initial approximation of the GoldSchmidt method
§Custom operation returns
New GoldschmidtDivision node
§Example
let c = create_context().unwrap();
let g = c.create_graph().unwrap();
let t = array_type(vec![2, 3], UINT64);
let dividend = g.input(t.clone()).unwrap();
let divisor = g.input(t.clone()).unwrap();
let guess_n = g.input(t.clone()).unwrap();
let n2 = g.custom_op(CustomOperation::new(GoldschmidtDivision {iterations: 10, denominator_cap_2k: 4}), vec![dividend,divisor, guess_n]).unwrap();Fields§
§iterations: u64Number of iterations of the Goldschmidt method; rule of thumb is to set it to 1 + log(denominator_cap_2k)
denominator_cap_2k: u64Number of output bits that are approximated
Trait Implementations§
Source§impl Debug for GoldschmidtDivision
impl Debug for GoldschmidtDivision
Source§impl<'de> Deserialize<'de> for GoldschmidtDivision
impl<'de> Deserialize<'de> for GoldschmidtDivision
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Hash for GoldschmidtDivision
impl Hash for GoldschmidtDivision
Source§impl PartialEq for GoldschmidtDivision
impl PartialEq for GoldschmidtDivision
Source§impl Serialize for GoldschmidtDivision
impl Serialize for GoldschmidtDivision
impl Eq for GoldschmidtDivision
impl StructuralPartialEq for GoldschmidtDivision
Auto Trait Implementations§
impl Freeze for GoldschmidtDivision
impl RefUnwindSafe for GoldschmidtDivision
impl Send for GoldschmidtDivision
impl Sync for GoldschmidtDivision
impl Unpin for GoldschmidtDivision
impl UnwindSafe for GoldschmidtDivision
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.