Commit Graph
763 Commits
Author SHA1 Message Date
Chip Hogg c8a44adee2 Add missing header for std::integral 2022-03-10 23:41:47 +00:00
Chip Hogg 04b80f0827 Use wheel factorization for prime numbers
Certain existing units in the library require very large prime
numbers---so large, in fact, that our naive trial division hits the
_iteration limit_ for `constexpr` loops.  We don't want to force users
to provide a compiler option override, so we'd better find another way.

The solution is to use the "wheel factorization" algorithm:
https://en.wikipedia.org/wiki/Wheel_factorization

This lets us skip most composite numbers in our trial division.  The
implementation presented here is configurable in terms of the size of
the "basis" of primes we use.  Bigger bases let us skip more primes, but
at the cost of storing more numbers.  Fortunately, it turns out that N=3
was good enough for our purposes.
2022-03-10 23:29:02 +00:00
Mateusz Pusz 2198c8a403 Merge pull request #334 from JohelEGP/ratio_maths_unused_header
refactor(bits): remove unused header
2022-03-10 21:43:04 +01:00
Mateusz Pusz 1b9d680275 Merge pull request #335 from JohelEGP/non_static_constexpr_globals
refactor: drop `static` from `constexpr` globals
2022-03-10 21:23:00 +01:00
Johel Ernesto Guerrero Peña 72046b0fe7 refactor: drop static from constexpr globals 2022-03-10 14:33:32 -04:00
Mateusz Pusz 6193854f31 Merge pull request #333 from chiphogg/chiphogg/intmax
Use intmax for base of integral powers
2022-03-10 19:29:23 +01:00
Mateusz Pusz a5fff2f210 Merge branch 'master' of github.com:mpusz/units 2022-03-10 19:05:41 +01:00
Mateusz Pusz 6171b8ab69 docs: Outdated TODO comments removed 2022-03-10 19:05:36 +01:00
Johel Ernesto Guerrero Peña eee4f7d49c refactor: remove unused header 2022-03-09 20:23:21 -04:00
Johel Ernesto Guerrero Peña b52da14e36 refactor(bits): remove unused header 2022-03-08 20:38:07 -04:00
Chip Hogg 240bdd659c Use intmax for base of integral powers
I used `int` before, because it was simple, and I thought _surely_ it
would be enough.  I mean, who's going to make a unit whose magnitude has
a prime factor bigger than 32 bits?

This brings us to the "Dalton", a unit whose ratio-magnitude numerator
is 16605390666050.  The prime factorization of 16605390666050 is
(2 * 5 * 5 * 53 * 6266185157), and this last number is bigger than 2^31
by a factor of 3 or so.

Fortunately, we should have done this from the beginning anyway, because
otherwise there would be numbers we could represent in `ratio` which we
couldn't represent in `Magnitude`, and this should never be the case.
2022-02-24 01:17:27 +00:00
Mateusz Pusz 3651e199bf Merge pull request #331 from JohelEGP/llvm15
refactor: update hacks for LLVM 15
2022-02-08 10:40:31 +01:00
Johel Ernesto Guerrero Peña 3f145a25db refactor: update hacks for LLVM 15 2022-02-07 21:07:22 -04:00
Chip Hogg 7820b3ef92 Clean up a few requires clauses 2022-02-06 22:11:42 +00:00
Chip Hogg a0ae08746f Restore mistakenly removed comment 2022-02-06 21:56:00 +00:00
Chip Hogg 7e4ab4206f Remove .value; provide free function only
This is a cleaner interface.

I also checked all of the commented-out test cases.
2022-02-06 21:53:05 +00:00
Chip Hogg 7615de4720 See if passing by const& will satisfy all compilers
The only reason we had the `is_magnitude_integral` type members before
is because the compiler complained about incomplete types.  Passing by
`const&` might eliminate this need.
2022-02-06 21:06:53 +00:00
Chip Hogg 9593ca04d7 Refer to class instead 2022-01-29 03:47:16 +00:00
Chip Hogg 408ad16528 Spell out fold expression, again 2022-01-29 03:19:30 +00:00
Chip Hogg dfe3db0b70 Merge branch 'master' into mag-value-t 2022-01-29 02:49:19 +00:00
Chip Hogg b36bc2b582 Turn get_value into free function 2022-01-29 02:40:51 +00:00
Chip Hogg d6eb25f07a Attempt to satisfy MSVC 14
```
test\unit_test\runtime\magnitude_test.cpp(143): error C2672:
'units::check_same_type_and_value': no matching overloaded function
found
```

Maybe it's confused by accessing the static member variable template
using dot-notation on an _instance_?  If so, let's see how it likes the
member-function syntax.
2022-01-28 22:42:23 +00:00
Chip Hogg 811b6ba53d Try inlining the fold expression to satisfy (?) MSVC 2022-01-28 22:24:30 +00:00
Chip Hogg f2ba3cc18a Use in_range for integer case 2022-01-28 20:33:17 +00:00
Chip Hogg e3a790667d Guessing at what MSVC wants 2022-01-28 20:13:35 +00:00
Chip Hogg 4c9a2c5c5c Remove unsupported consteval
I had been using "consteval plus exception" as my way to get
"static_assert, but for parameters".  Since consteval doesn't work, then
I can't _guarantee_ that the functions won't be called at runtime.
However, I still think throwing exceptions is better, because it will
cause the desired compiler errors on every configuration.  (`assert`
often gets compiled out.)

Very much open to suggestion here.
2022-01-28 19:52:35 +00:00
Chip Hogg ed351a4ba3 Avoid needing class to be completed 2022-01-28 19:34:50 +00:00
Chip Hogg a6b6afe438 Add value and categorization helpers for Magnitude
For each Magnitude `m`, we now support:

- `is_rational(m)` tells whether it represents a rational number.
- `is_integral(m)` tells whether it represents an integer (and
  `is_integral(m)` implies `is_rational(m)`).
- `m.value<T>` represents the value of `m` in the type `T`.

If `T` is integral, we only support `m.value<T>` when `is_integral(m)`.

We also perform all intermediate computations in the widest type of the
same category (floating point, signed, or unsigned).  This means we can,
for example, give first-class support to embedded users who may have
hardware support only for `float`: we can ensure they get the most
accurate `float` value we can compute, without burdening them with a
dependency on `long double` in their runtime code.

We are not yet ready to replace `ratio` as the definition of unit
magnitudes, but we're a step closer.  The next step will be to decompose
a Magnitude into numerator, denominator, and irrational parts, giving us
full bidirectional convertibility with existing `ratio` instances.  Then
we can migrate over in a controlled fashion.
2022-01-28 19:06:26 +00:00
Frank Dischner 771a400007 build: add support for AppleClang compiler 2022-01-26 18:18:51 -06:00
Frank Dischner ba6c378897 refactor: use libc++ version to determine range-v3 use
Allows using AppleClang where __clang_major__ does not match the
llvm/libc++ version.
2022-01-26 18:16:05 -06:00
Mateusz Pusz cab5e8b2fd Merge branch 'master' of github.com:mpusz/units 2022-01-25 13:30:10 +01:00
Mateusz Pusz d7ee8f23a8 build: Conan finally fixed gsl-lite
Relates to #318
2022-01-25 13:30:01 +01:00
Frank Dischner 684ef13d95 fix: derived_ratio calculation
Fixes the ratio calculation for derived units when the base unit ratio is
not one.
2022-01-18 21:54:21 -06:00
Mateusz Pusz 8493bf389e refactor: Forward declaration of as_magnitude() is not needed 2022-01-18 12:16:18 +01:00
Chip Hogg 1c70b18709 Unify "H1 base smaller" test cases
This might actually fix the error!
2022-01-12 10:47:59 -05:00
Chip Hogg 038616c901 Try rearranging the order
Maybe this will help me understand where the problem lies.
2022-01-12 10:11:50 -05:00
Chip Hogg fb602a4497 Try fixing "unreachable code" warning on MSVC 14.2
This doesn't show up on any other compiler, including MSVC 14.3, so I
think it's just a compiler bug.  Cursory googling suggests perhaps that
some older versions of MSVC have immature support for `if constexpr`.
2022-01-12 09:47:40 -05:00
Chip Hogg d554fb28cc Try fixing MSVC internal compiler error
I'm breaking apart the requirements into simpler pieces, but I don't
really know if that will help.
2022-01-11 20:33:48 -05:00
Chip Hogg bdf488db04 Remove unnecessary forward declaration 2022-01-11 19:34:57 -05:00
Chip Hogg 08818ac6a8 Make pow()'s argument a simple (non-template) parameter 2022-01-11 19:19:25 -05:00
Chip Hogg a8d6c890a5 Move pi_to_the to the test file 2022-01-11 19:12:27 -05:00
Chip Hogg 3042135eb9 Try fixing clang build failures 2022-01-11 12:56:14 -05:00
Chip Hogg cee4be2b67 Simplify namespaces and canonicalize formatting
The motivation for the `mag` sub-namespace was to distinguish something
like `mag::product_t<...>` from `dim::product_t<...>`, based on the
idioms of Aurora Units.  However, we have no need for a `product_t` type
trait, since we can just use `operator*()`, so we can eliminate this
sub-namespace.
2022-01-10 14:28:02 -05:00
Chip Hogg 4f90302dd7 Constrain strictly_increasing to signed values 2022-01-10 14:27:04 -05:00
Chip Hogg f783d7f274 Handle exp explicitly in as_magnitude()
The new test actually passed without modifying the code.  However, that
might be implementation-dependent (presumably based on canonicalization
of the `ratio` template parameter), so I wanted a more obviously correct
implementation.
2022-01-08 19:34:42 -05:00
Chip Hogg 409aaf4636 Generalize inverse() to pow<...>() 2022-01-08 19:34:21 -05:00
Chip Hogg 053de8d539 Replace structs with variables 2022-01-08 18:34:14 -05:00
Chip Hogg ba458d479e Fix remaining constraints 2022-01-08 18:19:40 -05:00
Chip Hogg 41995464f0 Fix magnitude constraints
I got my requires expressions/clauses mixed up.

Unfortunately, this means we can't just shove all the "implementation
details" down to the bottom of the file.  Oh well.
2022-01-08 18:13:48 -05:00
Chip Hogg 0a470f2617 Replace make_ratio with as_magnitude<ratio>
It's cleaner to just have the one way.
2022-01-08 17:29:40 -05:00