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
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_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_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
On Sun, 18 Nov 2018 at 05:31, Richard Z?vodn? via Boost-users
mailto:boost-users@lists.boost.org> wrote: ---------- Forwarded message --------- From: *Richard Z?vodn?*
mailto:zavodnyrichard@gmail.com> Date: Sat, Nov 17, 2018, 3:59 PM Subject: Boost::Filesystem - How to iterate, through the whole drive To: 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
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
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
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
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
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
On Tue, 20 Nov 2018 at 12:37, degski
On Tue, 20 Nov 2018 at 10:31, degski
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
,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