public static AnyQuantity <T> Divide(AnyQuantity <T> firstQuantity, AnyQuantity <T> secondQuantity) { //to preserve the units we make a derivedquantity with passed quantities // then we take the derived unit in temporary store // then we try to get strongly typed Quantity // then assign the unit to the generated quantity. // this way we won't have to know the unit system of the quantity. AnyQuantity <T> sec_qty = (AnyQuantity <T>)secondQuantity.Invert(); //this is a divide process we must make 1/exponenet :) AnyQuantity <T> qresult = (AnyQuantity <T>)ConstructDerivedQuantity(firstQuantity, sec_qty); try { qresult = QuantityDimension.QuantityFrom <T>(qresult.Dimension); } catch (QuantityNotFoundException) { } if (typeof(T) == typeof(decimal) || typeof(T) == typeof(double) || typeof(T) == typeof(float) || typeof(T) == typeof(int) || typeof(T) == typeof(short)) { qresult.Value = (T)(object)(((double)(object)firstQuantity.Value) * ((double)(object)sec_qty.Value)); if (firstQuantity.Unit != null && secondQuantity.Unit != null) { Unit un = new Unit(qresult.GetType(), firstQuantity.Unit, sec_qty.Unit); qresult.Unit = un; if (un.IsOverflowed) { qresult.Value = (T)(object)(un.GetUnitOverflow() * ((double)(object)qresult.Value)); } } } else { qresult.Value = DivideGenericByGeneric(firstQuantity.Value, secondQuantity.Value); //check if any of the two quantities have a valid unit // to be able to derive the current quantity if (firstQuantity.Unit != null && secondQuantity.Unit != null) { Unit un = new Unit(qresult.GetType(), firstQuantity.Unit, sec_qty.Unit); qresult.Unit = un; if (un.IsOverflowed) { qresult.Value = MultiplyScalarByGeneric(un.GetUnitOverflow(), qresult.Value); } } } return(qresult); }
public static AnyQuantity <T> Multiply(AnyQuantity <T> firstQuantity, AnyQuantity <T> secondQuantity) { AnyQuantity <T> qresult = (AnyQuantity <T>)ConstructDerivedQuantity <T>(firstQuantity, secondQuantity); try { //correct quantities and units qresult = QuantityDimension.QuantityFrom <T>(qresult.Dimension); } catch (QuantityNotFoundException) { } if (typeof(T) == typeof(decimal) || typeof(T) == typeof(double) || typeof(T) == typeof(float) || typeof(T) == typeof(int) || typeof(T) == typeof(short)) { qresult.Value = (T)(object)(((double)(object)firstQuantity.Value) * ((double)(object)secondQuantity.Value)); if (firstQuantity.Unit != null && secondQuantity.Unit != null) { Unit un = new Unit(qresult.GetType(), firstQuantity.Unit, secondQuantity.Unit); qresult.Unit = un; if (un.IsOverflowed) { qresult.Value = (T)(object)(un.GetUnitOverflow() * ((double)(object)qresult.Value)); } } } else { qresult.Value = MultiplyGenericByGeneric(firstQuantity.Value, secondQuantity.Value); //check if any of the two quantities have a valid unit // to be able to derive the current quantity if (firstQuantity.Unit != null && secondQuantity.Unit != null) { Unit un = new Unit(qresult.GetType(), firstQuantity.Unit, secondQuantity.Unit); qresult.Unit = un; if (un.IsOverflowed) { qresult.Value = MultiplyScalarByGeneric(un.GetUnitOverflow(), qresult.Value); } } } return(qresult); }