<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:&quot;Cambria&quot;,&quot;serif&quot;">LS,</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">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:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</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>&nbsp;&nbsp;&nbsp;&nbsp; typedef unit&lt;dimensionless_type, system&gt; dimensionless;<br>}<br><br>Maybe not but you can try.<br>&nbsp;</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:&quot;Cambria&quot;,&quot;serif&quot;">---START CODE ---</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boost::units::base_unit&lt;<wbr>length_base_unit, length_dimension, 1&gt;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:blue">typedef</span> boost::units::make_system&lt;<wbr>length_base_unit&gt;::type system;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:blue">typedef</span> unit&lt;length_dimension,system&gt; length;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:blue">double</span>, 1.852e3);</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">---END CODE ---</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">The following does not compile:</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">---START CODE ---</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">&nbsp;</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&lt;boost::units::si::<wbr>plane_angle&gt; 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&lt;<wbr>nautical::length&gt; TNauticalDistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;</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:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">---END CODE ---</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">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">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">---START CODE ---</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">&nbsp;</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&lt;boost::units:<wbr>:si::meter_base_unit, scale&lt;1852, static_rational&lt;1&gt; &gt; &gt; 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">&nbsp;</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&lt;nautical_mile_unit&gt; TNauticalDistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">---END CODE ---</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">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:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">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:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">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">&nbsp;</span></p><p style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;"><span>-<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">the solution from the documentation does not compile</span></p><p style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;"><span>-<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">the solution from ‘nautical_mile.hpp’ uses a scaled base unit which is limited to scaling factors of the form scale&lt;Base,Exponent&gt;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">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:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">Help would be highly appreciated,</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">Pieter</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">&nbsp;</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">&nbsp;</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&lt;boost::units:<wbr>:si::meter_base_unit, scale&lt;1852, static_rational&lt;1&gt; &gt; &gt; 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">&nbsp;</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">&lt;&gt;</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&lt;metric::<wbr>nautical_mile_base_unit&gt; </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">&nbsp;&nbsp;&nbsp; <span style="color:blue">static</span> <span style="color:blue">const</span> <span style="color:blue">char</span>* name()&nbsp;&nbsp; { <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">&nbsp;&nbsp;&nbsp; <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">&nbsp;</p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">&nbsp;</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&lt;boost::units::si::<wbr>plane_angle&gt; 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&lt;boost::units::si::<wbr>length&gt; TDistanceInM;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">&nbsp;</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&lt;nautical_mile_unit&gt; TDistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">&nbsp;</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&lt;<wbr>nautical::length&gt; TNauticalDistanceInNMI;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;</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">&nbsp;</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">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;</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">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">&nbsp;</span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">&nbsp;</span></p></div></div></blockquote>