mir: How to change iterator?
Basile B.
b2.temp at gmx.com
Thu Apr 16 19:56:21 UTC 2020
On Tuesday, 14 April 2020 at 20:24:05 UTC, jmh530 wrote:
> In the code below, I multiply some slice by 5 and then check
> whether it equals another slice. This fails for mir's
> approxEqual because the two are not the same types (yes, I know
> that isClose in std.math works). I was trying to convert the y
> variable below to have the same double* iterator as the term on
> the right, but without much success. I tried std.conv.to and
> the as, slice, and sliced functions in mir.
>
> I figure I am missing something basic, but I can't quite figure
> it out...
>
>
> /+dub.sdl:
> dependency "mir-algorithm" version="~>3.7.28"
> +/
>
> import mir.math.common: approxEqual;
> import mir.ndslice.slice : sliced;
>
> void main() {
> auto x = [0.5, 0.5].sliced(2);
> auto y = x * 5.0;
>
> assert(approxEqual(y, [2.5, 2.5].sliced(2)));
> }
`approxEqual` cant work with ranges. If you look at the signature
there is a use of the constructor syntax, e.g const `T maxRelDiff
= T(0x1p-20f)` so when `T` is not a basic FP type that just does
not compile (note the error message if you try with .array on
both operands)
I'd just use zip(...).each!(...), e.g
assert(zip(y, [2.5, 2.5].sliced(2)).each!(a =>
assert(approxEqual(a[0], a[1]))));
But I don't know MIR at all.
More information about the Digitalmars-d-learn
mailing list