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 am having trouble converting from one derived_dimension to another across systems (imperial to metric). I'd like to convert, say, lb/in to, say, kg/m. I thought I would do the following but get a compiler error #:
*.h-------------------------------------------------------------------------------- namespace dimensional_analysis { namespace lineal_force { //lb/in typedef boost::units::derived_dimension< boost::units::us::pound_force_base_unit, 1, boost::units::us::inch_base_unit, -1 >::type lb_per_inch_dimension; typedef boost::units::unit< lb_per_inch_dimension, dimensional_analysis::lengths::ip_system > lb_per_inch_unit; typedef boost::units::quantity<lb_per_inch_unit, double> lb_per_inch_quantity; BOOST_UNITS_STATIC_CONSTANT(lbpin, lb_per_inch_quantity); //kg/m typedef boost::units::derived_dimension< boost::units::si::kilogram_base_unit, 1, boost::units::si::meter_base_unit, -1 >::type kg_per_meter_dimension; typedef boost::units::unit< kg_per_meter_dimension, boost::units::si::system > kg_per_meter_unit; typedef boost::units::quantity<kg_per_meter_unit, double> kg_per_meter_unit_quantity; BOOST_UNITS_STATIC_CONSTANT(kgpm, kg_per_meter_unit_quantity); }//lineal_force }//dimensional_analysis
*.cp ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //Do I need these? BOOST_UNITS_DEFINE_CONVERSION_FACTOR(dimensional_analysis::lineal_force::kg_per_meter_unit, dimensional_analysis::lineal_force::lb_per_inch_unit, double, 0.0559974); // exact conversion BOOST_UNITS_DEFAULT_CONVERSION(dimensional_analysis::lineal_force::kg_per_meter_unit, dimensional_analysis::lineal_force::lb_per_inch_unit);
//This does not compile# const auto conv_factor_try0 = conversion_factor(dimensional_analysis::lineal_force::kg_per_meter_unit::unit_type(), dimensional_analysis::lineal_force::lb_per_inch_unit::unit_type());
# *\boost_1_68_0\boost\units\detail\conversion_impl.hpp(340): error C2672: 'conversion_factor': no matching overloaded function found (compiling source file...*.cpp)
Any help is appreciated
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:
On Sun, 18 Nov 2018 at 05:31, Richard Z?vodn? via Boost-users <boost-users@lists.boost.org <mailto:boost-users@lists.boost.org>> wrote:
---------- Forwarded message --------- From: *Richard Z?vodn?* <zavodnyrichard@gmail.com <mailto:zavodnyrichard@gmail.com>> Date: Sat, Nov 17, 2018, 3:59 PM Subject: Boost::Filesystem - How to iterate, through the whole drive To: <boost-users@lists.boost.org <mailto:boost-users@lists.boost.org>>
Hey guys, I need iterate over all directories from starting path. If I start iterating from C:\some-dir it works very well, however if I try to iterate from C:\, it doesn't work. How can iterate through the whole drive? Thank you.
Code is here: https://pastebin.com/mpsKJxH2 <https://pastebin.com/3J6FEMG5>. The problem I experience is commented right in the code section (line 1, 13 and 25).
This works for me, either with boost-1.68 (not that I think that matters) or the STL-VC-15.9.1 (/std:c++17):
#include <iostream> #include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
int main ( ) { ??? for ( auto & p : fs::recursive_directory_iterator ( "d:\\" ) ) { ??????? std::cout << p.path ( ) << '\n'; ??? } }
Note that: "The iteration order is unspecified, except that each directory entry is visited only once."
degski -- /*/*?*/If something cannot go on forever, it will stop" - Herbert Stein*/
AMDG On 11/19/2018 09:09 PM, Matt Vinson via Boost-users wrote:
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"....
How is it wrong? length cancels out. The divides version will give exactly the same type.
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;
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.
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;
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.)
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 <snip>
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.
From Wikipedia <https://en.wikipedia.org/wiki/Kilogram-force>: * Kilogram-force is a non-standard unit and is classified in SI Metric System <https://en.wikipedia.org/wiki/International_System_of_Units> as a unit
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 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.
From Wikipedia <https://en.wikipedia.org/wiki/Kilogram-force>: * Kilogram-force is a non-standard unit and is classified in SI Metric System <https://en.wikipedia.org/wiki/International_System_of_Units> as a unit 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* _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org https://lists.boost.org/mailman/listinfo.cgi/boost-users
On Tue, 20 Nov 2018 at 10:38, Nathan Ernst <nathan.ernst@gmail.com> wrote:
In the meanwhile the Kg has been redefined. The new definition is based on invariant constants of nature.
It's not like 1 kg suddenly became 1.1 kg according to the new standard.
Darn, I was hoping it would go down instead and stuff would get a lot cheaper ;-). degski -- *“If something cannot go on forever, it will stop" - Herbert Stein*
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:
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].
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