Commit Graph
32 Commits
Author SHA1 Message Date
Chip Hogg 632f2785a9 Clarify section header 2022-02-24 01:48:02 +00: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
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 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 2384276ae0 Only test pi if float is smaller than long double 2022-01-28 20:44:29 +00:00
Chip Hogg 243238b3fa Add suggested tests 2022-01-28 20:41:08 +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
Chip Hogg a306472a6b Reuse callables in pairwise_all tests 2022-01-11 19:44:10 -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 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 c64f392dc3 Remove some extra spaces 2022-01-10 14:23:44 -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 325cbc8fa9 Finish adding tests 2022-01-08 18:14:22 -05:00
Chip Hogg f12fde6204 Add some tests 2022-01-08 17:57:10 -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
Chip Hogg ef6f937460 Clean up and reorder file 2022-01-08 17:18:33 -05:00
Chip Hogg 838b132a61 Finish migrating base_power to NTTP 2022-01-08 15:08:05 -05:00
Chip Hogg 3063aebe5a Clean up pairwise_all() and strictly_increasing() 2022-01-08 14:28:53 -05:00
Chip Hogg 92b7a15d6f (partial) Switch base_power to NTTP
Apparently, gcc-10 does not support floating point NTTPs, so we'll need
to reimagine the approach.
2022-01-08 14:04:19 -05:00
Chip Hogg 63910131ff Try fixing MSVC 14 bug
I don't know how to test this locally.
2022-01-04 14:14:22 -05:00
Chip Hogg 4246f2db2a Remove unused variable names
Should fix clang builds
2022-01-04 14:01:42 -05:00
Chip Hogg bb4fe5040d Factor out logic into pairwise_all() helper
We could move this somewhere more generic if we want.
2022-01-03 15:20:05 -05:00
Chip Hogg 626c7bfe39 Fix up for review
- 120 line limit
- uppercase template params
- doxygen comments for public APIs
- `int_base` -> `prime_base`
2021-12-30 10:47:01 -05:00
Chip Hogg 05934c8b72 Add make_base_power() helper 2021-12-29 21:37:06 -05:00
Chip Hogg c75eb02ea7 Finish fleshing out make_ratio 2021-12-29 21:21:58 -05:00
Chip Hogg 8a1ed3adcb Add make_ratio() helper and prime factorization 2021-12-29 21:21:58 -05:00
Chip Hogg 2c229710e7 Create and use BasePower concept 2021-12-29 21:21:57 -05:00
Chip Hogg 0566158e91 Add concept for magnitude 2021-12-29 21:21:57 -05:00
Chip Hogg 0c5ae082d5 Add magnitude with product, inverse, quotient
For now, all templates are unconstrained; we hope to clean that up
later.
2021-12-29 21:21:57 -05:00