boost::units - converting from one derived_dimension to another across systems (imperial to metric)

Eisuke Kawashima: Thank You. I'll have a look. When I saw Boost.Units did not have imperial and we had to create it ourselves, I thought: the US is s 5 trillion dollar market, most of those markets need programming, all are on imperial. Boost.Units needs imperial and programmers would find and use it. Steven Watanabe: Thank You. This solution doesn't seem correct as it does not consider "length".... boost::units::derived_dimension< boost::units::mass_base_dimension, 1, boost::units::time_base_dimension, -2>::typeI thought I'd at it (L M T^-2 L-1) but this didn't do well.: typedef boost::units::derived_dimension< boost::units::length_base_dimension, 1, boost::units::mass_base_dimension, 1, boost::units::time_base_dimension, -2, boost::units::length_base_dimension, -1 >::type lineal_force_dimension; So, I tried the " typedef boost::mpl::divides<...>" solution as it has force and length. I am closer, I hope. *.h------------------------------------------------------------------------------------------------------------------------------------------ namespace dimensional_analysis { typedef boost::units::length_base_dimension::dimension_type length_dimension; typedef boost::units::mass_base_dimension::dimension_type mass_dimension; typedef boost::units::make_system< boost::units::us::inch_base_unit, boost::units::us::pound_base_unit >::type ip_system; namespace lineal_force { typedef boost::mpl::divides< boost::units::force_dimension, boost::units::length_dimension>::type lineal_force_dimension; namespace imperial { typedef boost::units::unit< lineal_force_dimension, dimensional_analysis ::ip_system > lineal_force_unit; typedef boost::units::quantity<lineal_force_unit, double> pound_per_in_quantity; BOOST_UNITS_STATIC_CONSTANT(pound_per_inch, pound_per_in_quantity); } namespace si { typedef boost::units::unit< lineal_force_dimension, boost::units::si::system > lineal_force_unit; typedef boost::units::quantity<lineal_force_dimension, double> kg_per_meter_quantity; BOOST_UNITS_STATIC_CONSTANT(kg_per_meter, kg_per_meter_quantity); } }//lineal_force }//dimensional_analysis *.cpp------------------------------------------------------------------------------------------------------------------------------------------ BOOST_UNITS_DEFINE_CONVERSION_FACTOR(dimensional_analysis::lineal_force::imperial::lineal_force_unit, dimensional_analysis::lineal_force::si::lineal_force_unit, double, 17.858); // exact conversion BOOST_UNITS_DEFAULT_CONVERSION(dimensional_analysis::lineal_force::imperial::lineal_force_unit, dimensional_analysis::lineal_force::si::lineal_force_unit); BOOST_UNITS_DEFINE_CONVERSION_FACTOR(dimensional_analysis::lineal_force::si::lineal_force_unit, dimensional_analysis::lineal_force::imperial::lineal_force_unit, double, 0.0559974); // exact conversion BOOST_UNITS_DEFAULT_CONVERSION(dimensional_analysis::lineal_force::si::lineal_force_unit, dimensional_analysis::lineal_force::imperial::lineal_force_unit); //This is not converting force/length and is converting si -> imperial mass (only) = 110.2. Needs to consider force/length, =50*0.0559974 auto t1 = static_cast<boost::units::quantity<dimensional_analysis::lineal_force::imperial::lineal_force_unit>>( 50.0 * dimensional_analysis::lineal_force::si::lineal_force_unit::unit_type()); / This is not converting force/length and i sconverting imperial -> si mass (only) = 22.7. Needs to consider force/length, =50*17.858 auto t2 = static_cast<boost::units::quantity<dimensional_analysis::lineal_force::si::lineal_force_unit>>( 50.0 * dimensional_analysis::lineal_force::imperial::lineal_force_unit::unit_type()); //This is again only converting mass and needs to convert force/length const auto t3 = boost::units::conversion_factor( dimensional_analysis::lineal_force::imperial::lineal_force_unit::unit_type(), dimensional_analysis::lineal_force::si::lineal_force_unit::unit_type()); On Monday, November 19, 2018, 12:46:57 PM CST, boost-users-request@lists.boost.org <boost-users-request@lists.boost.org> wrote: Send Boost-users mailing list submissions to boost-users@lists.boost.org To subscribe or unsubscribe via the World Wide Web, visit https://lists.boost.org/mailman/listinfo.cgi/boost-users or, via email, send a message with subject or body 'help' to boost-users-request@lists.boost.org You can reach the person managing the list at boost-users-owner@lists.boost.org When replying, please edit your Subject line so it is more specific than "Re: Contents of Boost-users digest..." Today's Topics: 1. Re: boost::units - converting from one derived_dimension to another across systems (imperial to metric) (Eisuke Kawashima) 2. Re: Fwd: Boost::Filesystem - How to iterate, through the whole drive (Richard Z?vodn?) 3. Re: boost::units - converting from one derived_dimension to another across systems (imperial to metric) (Steven Watanabe) 4. Re: [release] Boost 1.69.0 Beta 1 (Marshall Clow) ---------------------------------------------------------------------- Message: 1 Date: Tue, 20 Nov 2018 02:23:10 +0900 From: Eisuke Kawashima <e.kawaschima+boost@gmail.com> To: boost-users@lists.boost.org Subject: Re: [Boost-users] boost::units - converting from one derived_dimension to another across systems (imperial to metric) Message-ID: <CAHhxtD6A9Jwhv5amKnTa1bmNkD0U4_LGre8ySKFfQXK7w62oEQ@mail.gmail.com> Content-Type: text/plain; charset="UTF-8" Hi list,
I opened a PR (https://github.com/boostorg/units/pull/32) to address such a situation; the following code ```cpp #include <iostream> #include <boost/units/base_units/us/inch.hpp> #include <boost/units/base_units/us/pound_force.hpp> #include <boost/units/io.hpp> #include <boost/units/physical_dimensions.hpp> #include <boost/units/systems/si.hpp> int main() { auto force_us{1.0 * boost::units::us::pound_force}; auto length_us{1.0 * boost::units::us::inch}; boost::units::quantity<boost::units::si::force, double> force_si{force_us}; boost::units::quantity<boost::units::si::length, double> length_si{length_us}; std::cout << force_us << " = " << force_si << '\n'; std::cout << length_us << " = " << length_si << '\n'; std::cout << force_us / length_us << " = " << force_si / length_si << '\n'; return 0; } ``` will print ``` 1 lbf = 4.44822 m kg s^-2 1 in = 0.0254 m 1 lbf in^-1 = 175.127 kg s^-2 ``` Best -- Eisuke Kawashima ------------------------------ Message: 2 Date: Mon, 19 Nov 2018 19:24:58 +0100 From: Richard Z?vodn? <zavodnyrichard@gmail.com> To: degski <degski@gmail.com>, boost-users@lists.boost.org Subject: Re: [Boost-users] Fwd: Boost::Filesystem - How to iterate, through the whole drive Message-ID: <d13622b0-9a68-d109-c26e-b60e3a5c45c8@gmail.com> Content-Type: text/plain; charset="utf-8"; Format="flowed" I just wanna try it again here, maybe somebody will shop up who knows where is the problem as I unfortunately couldn't fix it with degski (but still, thank you for your time :)). His example (can be found below) doesn't work on my system. The problem is I can't start iteration from the drive root (for example E:\), because it will iterate only the directory above (E:\projects\boost\build) the directory that the executable is located in (the executable is located in E:\projects\boost\build\Debug). What is weird that if I move the executable to the different directory (let's say C:\Users\USER_NAME\Downloads) it will still iterate only the build directory. I tried to play with Visual Studio -> PROJECT_NAME -> Properties -> Debugging -> Working Directory, but without a success. According to degski he has the value of this entry set to $(ProjectDir) which is the same value as mine. Thank you. On 11/18/2018 9:04 AM, degski wrote:

AMDG On 11/19/2018 09:09 PM, Matt Vinson via Boost-users wrote:
How is it wrong? length cancels out. The divides version will give exactly the same type.
derived_dimension can't handle multiple uses of the same base dimension. Even if it did, it would just cancel them out, so this serves to purpose.
This is not the unit you want. The SI unit of force is N, not kg. kilogram-force is not currently provided by Boost.Units and you'll need to define it yourself. (As in your previous post.)
In Christ, Steven Watanabe

On Tue, 20 Nov 2018 at 07:06, Steven Watanabe via Boost-users < boost-users@lists.boost.org> wrote:
This is not the unit you want. The SI unit of force is N, not kg.
One wonders what has happened to the school system these days, this is basic stuff that was taught to kids 13/14 years of age ad nauseam. To expand on what Steven has been [economically] stating: Wikipedia <https://en.wikipedia.org/wiki/Newton_(unit)> definition: *One newton is the force needed to accelerate <https://en.wikipedia.org/wiki/Acceleration> one kilogram <https://en.wikipedia.org/wiki/Kilogram> of mass at the rate of one metre per second squared <https://en.wikipedia.org/wiki/Metre_per_second_squared> in the direction of the applied force. *And from Wikipedia <https://en.wikipedia.org/wiki/Mass_versus_weight> again: *... an object with a mass of 1.0 kilogram will weigh approximately 9.81 newtons on the surface of the Earth <https://en.wikipedia.org/wiki/Earth> (its mass multiplied by the gravitational field strength <https://en.wikipedia.org/wiki/Gravity>), since the newton <https://en.wikipedia.org/wiki/Newton_(unit)> is a unit of force, while the kilogram <https://en.wikipedia.org/wiki/Kilogram> is a unit of mass.* kilogram-force
is not currently provided by Boost.Units and you'll need to define it yourself.
that is unacceptable for use with SI. It is equal to the magnitude of the force exerted on one kilogram <https://en.wikipedia.org/wiki/Kilogram> of mass <https://en.wikipedia.org/wiki/Mass> in a 9.80665 m/s2 gravitational field (standard gravity <https://en.wikipedia.org/wiki/Standard_gravity>, a conventional value approximating the average magnitude of gravity on Earth). Therefore, one kilogram-force is by definition equal to 9.80665 N <https://en.wikipedia.org/wiki/Newton_(unit)>*. The "by definition" here is important, depending on where you are on the planet, the real value will vary. In the meanwhile the Kg has been redefined. The new definition is based on invariant constants of nature. I*s there anything Boost needs to do to comply with this new definition* [or does it require serious multi-precision to actually see a difference [I suspect so, but still it should be defined in terms of these constants]]? The constant that did get redefined to make this [the above Kg definition] possible is the Planck constant <https://en.wikipedia.org/wiki/Planck_constant>. The new value [as of 20 May 2019] of the Planck constant by the ISO standard is set to 6.626 070 150 x 10-34 J⋅s. Some other constants got redefined as well: *... in order to support the redefinition of the SI base units, CODATA made a special release that was published in October 2017.[30] <https://en.wikipedia.org/wiki/Planck_constant#cite_note-30> It incorporates all data up to 1 July 2017 and determines the final numerical values of the Planck constant, h, Elementary charge <https://en.wikipedia.org/wiki/Elementary_charge>, e, Boltzmann constant <https://en.wikipedia.org/wiki/Boltzmann_constant>, k, and Avogadro constant <https://en.wikipedia.org/wiki/Avogadro_constant>, NA, that are to be used for the new SI definitions. * degski -- *“If something cannot go on forever, it will stop" - Herbert Stein*

In the meanwhile the Kg has been redefined. The new definition is based on invariant constants of nature.
I doubt it. The redefinition was done to eliminate a physical reference standard (there is no longer a need to compare various national lumps of platinum/iridium against a lump in France). It's not like 1 kg suddenly became 1.1 kg according to the new standard. On Tue, Nov 20, 2018, 2:32 AM degski via Boost-users < boost-users@lists.boost.org wrote:

On Tue, 20 Nov 2018 at 10:31, degski <degski@gmail.com> wrote:
The new value [as of 20 May 2019] of the Planck constant by the ISO standard is set to 6.626 070 150 x 10-34 J⋅s.
The currently defined value is: /// Planck constant BOOST_UNITS_PHYSICAL_CONSTANT(h,quantity<energy_time>,6.62606896e-34*joule*seconds,3.3e-41*joule*seconds); Hmmm, that's not a fun problem, thinking about it [in terms of Boost releases of before and after 20th of May 2019]. degski -- *“If something cannot go on forever, it will stop" - Herbert Stein*

On Tue, 20 Nov 2018 at 12:37, degski <degski@gmail.com> wrote:
The "new" Planck constant works pretty well with IEEE754, it [6.626 070 150 x 10-3] will be represented as 6.62607014999999983e-34, so not bad. degski -- *“If something cannot go on forever, it will stop" - Herbert Stein*
participants (4)
-
degski
-
Matt Vinson
-
Nathan Ernst
-
Steven Watanabe