<br><br>On Tuesday, January 3, 2012 3:56:11 AM UTC-8, Pieter B. wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div link="blue" vlink="purple" lang="EN-US"><div><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">LS,</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">I have some problems working with user defined quantities/units in combination with unitless quantities (such as the results of a sin() or cos() operations).Taking the example of the ‘nautical mile’, which is presented in the documentation:</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span><br></p></div></div></blockquote><div>I am not sure but it maybe that your units system needs an explicit dimensionless unit. ???<br><br>namespace nautical{<br> typedef unit<dimensionless_type, system> dimensionless;<br>}<br><br>Maybe not but you can try.<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div link="blue" vlink="purple" lang="EN-US"><div><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">---START CODE ---</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">namespace</span><span style="font-size:9.5pt;font-family:Consolas"> nautical {</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">struct</span> length_base_unit :</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> boost::units::base_unit<<wbr>length_base_unit, length_dimension, 1></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> {</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">static</span> std::string name() { <span style="color:blue">return</span> <span style="color:#a31515">"nautical mile"</span>; }</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">static</span> std::string symbol() { <span style="color:blue">return</span> <span style="color:#a31515">"nmi"</span>; }</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> };</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">typedef</span> boost::units::make_system<<wbr>length_base_unit>::type system;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">typedef</span> unit<length_dimension,system> length;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">static</span> <span style="color:blue">const</span> length mile,miles;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">} </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">BOOST_UNITS_DEFINE_CONVERSION_<wbr>FACTOR(nautical::length_base_<wbr>unit,</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> boost::units::si::meter_base_<wbr>unit,</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">double</span>, 1.852e3);</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">---END CODE ---</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">The following does not compile:</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">---START CODE ---</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas"> quantity<boost::units::si::<wbr>plane_angle> TAngleInRad;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas"> boost::units::quantity<<wbr>nautical::length> TNauticalDistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">TNauticalDistanceInNMI NauticalDistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">TNauticalDistanceInNMI SumNauticalDistanceInNMI = NauticalDistanceInNMI + NauticalDistanceInNMI; // OK</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">TNauticalDistanceInNMI ScaledSumNauticalDistanceInNMI = NauticalDistanceInNMI + NauticalDistanceInNMI*sin(<wbr>AngleInRad); </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">// Last line does not compile due to lack of a suitable operator+</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">---END CODE ---</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">It <i>does</i> work correctly when using the ‘nautical mile’ as it has been defined in the library itself in “nautical_mile.hpp” (as a scaled base unit related to the si::meter):</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">---START CODE ---</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">namespace</span><span style="font-size:9.5pt;font-family:Consolas"> metric {</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas"> scaled_base_unit<boost::units:<wbr>:si::meter_base_unit, scale<1852, static_rational<1> > > nautical_mile_base_unit;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">} // definition of the nautical mile from “nautical_mile.hpp”</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas"> boost::units::metric::<wbr>nautical_mile_base_unit::unit_<wbr>type nautical_mile_unit;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas"> quantity<nautical_mile_unit> TNauticalDistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">---END CODE ---</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">However, I don’t think I can specify my user-defined units/quantities in this manner as they use a scale factor represented by an arbitrary floating point value. </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">My perception is that the example of the documentation does not work due to the mixing of quantities from the si system (the sin() returns a dimensionless quantity in that system) with user-defined quantities in another (‘nautical’) system, while the ‘nautical mile’ from ‘nautical_mile.hpp’ is a scaled version of the si::meter and thus defined within the realms of the si::system – but please correct me if I am wrong here.</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">My problem can thus be summarized as follows:</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p style="text-autospace:none"><span style="font-family:"Cambria","serif""><span>-<span style="font:7.0pt "Times New Roman""> </span></span></span><span style="font-family:"Cambria","serif"">the solution from the documentation does not compile</span></p><p style="text-autospace:none"><span style="font-family:"Cambria","serif""><span>-<span style="font:7.0pt "Times New Roman""> </span></span></span><span style="font-family:"Cambria","serif"">the solution from ‘nautical_mile.hpp’ uses a scaled base unit which is limited to scaling factors of the form scale<Base,Exponent></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">and my question is therefore: how can I define my user-defined units/quantities in such a way that they allow the required operations while being related to base units by an arbitrary scale factor?</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">Help would be highly appreciated,</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif"">Pieter</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Cambria","serif""> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">-------------------</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">Nautical mile version #1 (from the included nautical_mile.hpp):</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">namespace</span><span style="font-size:9.5pt;font-family:Consolas"> metric {</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas"> scaled_base_unit<boost::units:<wbr>:si::meter_base_unit, scale<1852, static_rational<1> > > nautical_mile_base_unit;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">}</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">template</span><span style="font-size:9.5pt;font-family:Consolas"><></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">struct</span><span style="font-size:9.5pt;font-family:Consolas"> base_unit_info<metric::<wbr>nautical_mile_base_unit> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">{</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">static</span> <span style="color:blue">const</span> <span style="color:blue">char</span>* name() { <span style="color:blue">return</span>(<span style="color:#a31515">"nautical mile"</span>); }</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">static</span> <span style="color:blue">const</span> <span style="color:blue">char</span>* symbol() { <span style="color:blue">return</span>(<span style="color:#a31515">"nmi"</span>); }</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">};</span></p><p class="MsoNormal"> </p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas"> quantity<boost::units::si::<wbr>plane_angle> TAngleInRad;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas"> quantity<boost::units::si::<wbr>length> TDistanceInM;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas"> boost::units::metric::<wbr>nautical_mile_base_unit::unit_<wbr>type nautical_mile_unit;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas"> quantity<nautical_mile_unit> TDistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas"> boost::units::quantity<<wbr>nautical::length> TNauticalDistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"># this is OK:</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">TAngleInRad Angle(0.5*radians);</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">TDistanceInNMI DistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">TDistanceInNMI SumDistanceInNMI = DistanceInNMI + DistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">TDistanceInNMI ScaledSumDistanceInNMI = DistanceInNMI + DistanceInNMI*sin(AngleInRad);</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">TNauticalDistanceInNMI NauticalDistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">TNauticalDistanceInNMI SumNauticalDistanceInNMI = NauticalDistanceInNMI + NauticalDistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">TNauticalDistanceInNMI ScaledSum NauticalDistanceInNMI = NauticalDistanceInNMI + NauticalDistanceInNMI*sin(<wbr>AngleInRad); // DOES NOT COMPILE for lack of a suitable operator+</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue"> </span></p></div></div></blockquote>