<div dir="auto">In c++ there is <div dir="auto"><a href="https://en.cppreference.com/w/cpp/numeric/math/fmod">https://en.cppreference.com/w/cpp/numeric/math/fmod</a></div><div dir="auto">And</div><div dir="auto"><a href="https://en.cppreference.com/w/cpp/numeric/math/remainder.html">https://en.cppreference.com/w/cpp/numeric/math/remainder.html</a></div></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Tue, 7 Oct 2025, 23:55 Barry DeZonia via gdal-dev, <<a href="mailto:gdal-dev@lists.osgeo.org">gdal-dev@lists.osgeo.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I'm not sure what the operational definition of raster is. In my world<br>
you can have a floating point raster (a grid of floating point values<br>
instead of a grid of integer values). I might be wrong about that in<br>
your context.<br>
<br>
Interestingly the Java language specs are helpful:<br>
<br>
See Section 15.17.3 Remainder Operator %<br>
<br>
in this document:<br>
<br>
<a href="https://docs.oracle.com/javase/specs/jls/se25/jls25.pdf" rel="noreferrer noreferrer" target="_blank">https://docs.oracle.com/javase/specs/jls/se25/jls25.pdf</a><br>
<br>
<br>
On Tue, Oct 7, 2025 at 4:47 PM Scott <<a href="mailto:public@postholer.com" target="_blank" rel="noreferrer">public@postholer.com</a>> wrote:<br>
><br>
> Hey Barry,<br>
><br>
> I can confirm there are a whole slew of issues I haven't begun to think<br>
> through! ;)<br>
><br>
> In context of a raster pixel, integers shouldn't be an issue. Can a<br>
> raster pixel even have a NaN value? A nodata IS a value. I don't even<br>
> know. Is this a chunk of code I'd encourage everyone to use? Definitely not.<br>
><br>
> Scott<br>
><br>
> On 10/7/25 14:30, Barry DeZonia wrote:<br>
> > This might be ill behaved for floating point. Rounding errors and<br>
> > correct behavior for Infs and NaNs etc can spring surprises on you.<br>
> > Java has a floating point modulus operator. I am betting the Double or<br>
> > Float class java api javadoc might discuss implementation notes.<br>
> ><br>
> > On Tue, Oct 7, 2025 at 4:24 PM Scott via gdal-dev<br>
> > <<a href="mailto:gdal-dev@lists.osgeo.org" target="_blank" rel="noreferrer">gdal-dev@lists.osgeo.org</a>> wrote:<br>
> >><br>
> >> Thanks for the idea Dan. Building on that, I added it upstream to the<br>
> >> MuParser source. Now I have it in libmuparser as well:<br>
> >><br>
> >> ./muparser-2.3.5/include/muParserTemplateMagic.h<br>
> >>      static T Mod(T pixel, T div) { return lround(pixel) -<br>
> >> ((lround(pixel) / lround(div)) * lround(div)); }<br>
> >><br>
> >> ./muparser-2.3.5/src/muParser.cpp<br>
> >>      DefineFun(_T("mod"), MathImpl<value_type>::Mod);<br>
> >><br>
> >> After rebuild, leads to:<br>
> >><br>
> >> gdal raster calc \<br>
> >>      --input "p=input.tif" \<br>
> >>      --calc="mod(p[1], 50) == 0 ? p[1] : 255" \<br>
> >>      --ot=Byte \<br>
> >>      --output="output.tif" --co COMPRESS=DEFLATE --overwrite --progress<br>
> >><br>
> >> Ideally, though, having a mod function in GDAL itself would be awesome.<br>
> >><br>
> >> Scott<br>
> >><br>
> >><br>
> >> On 10/7/25 09:52, Daniel Baston wrote:<br>
> >>> It's fairly straightforward to define functions in C++ and register them<br>
> >>> with muparser. You can see how we do this with "isnan" and "isnodata" here:<br>
> >>><br>
> >>> <a href="https://github.com/OSGeo/gdal/blob/" rel="noreferrer noreferrer" target="_blank">https://github.com/OSGeo/gdal/blob/</a><br>
> >>> ca7a2d38893a8d6cdc03653b47712f4442d99d65/frmts/vrt/<br>
> >>> vrtexpression_muparser.cpp#L27 <<a href="https://github.com/OSGeo/gdal/blob/" rel="noreferrer noreferrer" target="_blank">https://github.com/OSGeo/gdal/blob/</a><br>
> >>> ca7a2d38893a8d6cdc03653b47712f4442d99d65/frmts/vrt/<br>
> >>> vrtexpression_muparser.cpp#L27><br>
> >>><br>
> >>> I don't think we want too many custom functions, but adding "mod" seems<br>
> >>> like a good idea.<br>
> >>><br>
> >>> Dan<br>
> >>><br>
> >>> On Tue, Oct 7, 2025 at 12:30 PM Scott via gdal-dev <gdal-<br>
> >>> <a href="mailto:dev@lists.osgeo.org" target="_blank" rel="noreferrer">dev@lists.osgeo.org</a> <mailto:<a href="mailto:gdal-dev@lists.osgeo.org" target="_blank" rel="noreferrer">gdal-dev@lists.osgeo.org</a>>> wrote:<br>
> >>><br>
> >>>      Greetings!<br>
> >>><br>
> >>>      I've been unable to find a modulo operator in CLI calc. It's not in the<br>
> >>>      muparser functions or appear to be in the forth-coming 3.12 C pixel<br>
> >>>      functions.<br>
> >>><br>
> >>>      This has been working with muparser, but it's messy every time you need<br>
> >>>      a simple modulo. pixel is real or int, div is int:<br>
> >>><br>
> >>>      rint(pixel) - (rint(rint(pixel) / div) * div)<br>
> >>><br>
> >>>      Am I missing something? If not, consider this a feature request! :)<br>
> >>><br>
> >>>      Thanks!<br>
> >>>      Scott<br>
> >>><br>
> >>>      --<br>
> >>>      <a href="http://www.postholer.com" rel="noreferrer noreferrer" target="_blank">www.postholer.com</a> <<a href="http://www.postholer.com" rel="noreferrer noreferrer" target="_blank">http://www.postholer.com</a>><br>
> >>><br>
> >>>      _______________________________________________<br>
> >>>      gdal-dev mailing list<br>
> >>>      <a href="mailto:gdal-dev@lists.osgeo.org" target="_blank" rel="noreferrer">gdal-dev@lists.osgeo.org</a> <mailto:<a href="mailto:gdal-dev@lists.osgeo.org" target="_blank" rel="noreferrer">gdal-dev@lists.osgeo.org</a>><br>
> >>>      <a href="https://lists.osgeo.org/mailman/listinfo/gdal-dev" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/gdal-dev</a> <https://<br>
> >>>      <a href="http://lists.osgeo.org/mailman/listinfo/gdal-dev" rel="noreferrer noreferrer" target="_blank">lists.osgeo.org/mailman/listinfo/gdal-dev</a>><br>
> >>><br>
> >><br>
> >> _______________________________________________<br>
> >> gdal-dev mailing list<br>
> >> <a href="mailto:gdal-dev@lists.osgeo.org" target="_blank" rel="noreferrer">gdal-dev@lists.osgeo.org</a><br>
> >> <a href="https://lists.osgeo.org/mailman/listinfo/gdal-dev" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/gdal-dev</a><br>
><br>
_______________________________________________<br>
gdal-dev mailing list<br>
<a href="mailto:gdal-dev@lists.osgeo.org" target="_blank" rel="noreferrer">gdal-dev@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/gdal-dev" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/gdal-dev</a><br>
</blockquote></div>