Jump to page: 1 2
Thread overview
is it possible to sort a float range ?
Jun 23, 2021
someone
Jun 23, 2021
Jordan Wilson
Jun 23, 2021
Jordan Wilson
Jun 23, 2021
someone
Jun 24, 2021
mw
Jun 24, 2021
mw
Jun 24, 2021
Ali Çehreli
Jun 24, 2021
someone
Jun 24, 2021
jfondren
Jun 24, 2021
someone
Jun 23, 2021
someone
June 23, 2021

Please, look for the line marked +++

This is a structure with a public property returning a (still unsorted) range built on-the-fly from already-set properties, a basic range from a to z with n step where some specific values can be added in-between. The range is a float which I am currently using for currency (horrible) and later plan to move it to decimal 10 or the like.

public struct gudtRangeWhatIf {

   private float[] pnumValueCustom;
   private float pnumValueBaseLimit1;
   private float pnumValueBaseLimit2;
   private float pnumValueBaseStep;

   public float start() @property const { return pnumValueBaseLimit1; }
   public float end() @property const { return pnumValueBaseLimit2; }
   public float step() @property const { return pnumValueBaseStep; }

   public float[] range() @property const {

      float[] lnumRange;

      if (! (pnumValueBaseLimit1 == float.nan || pnumValueBaseLimit2 == float.nan || pnumValueBaseStep == float.nan)) {

         for (
            float lnumValue = pnumValueBaseLimit1;
            lnumValue <= pnumValueBaseLimit2;
            lnumValue += pnumValueBaseStep
            ) {

            lnumRange ~= lnumValue;

         }

      }

      foreach (float lnumValue; pnumValueCustom) {

         lnumRange ~= lnumValue;

      }

      return lnumRange; /// .sort!(r"a > b"c); /// doesn't work +++

   }

   this(
      in float lnumValueBaseLimit1,
      in float lnumValueBaseLimit2,
      in float lnumValueBaseStep
      ) {

      /// (1) given start limit > 0
      /// (2) given end limit > start limit
      /// (3) given step > 0

      if (lnumValueBaseLimit1 > 0f && lnumValueBaseLimit1 < lnumValueBaseLimit2 && lnumValueBaseStep > 0f) {

         pnumValueBaseLimit1 = lnumValueBaseLimit1;
         pnumValueBaseLimit2 = lnumValueBaseLimit2;
         pnumValueBaseStep = lnumValueBaseStep;

      }

   }

   public void addCustomValue(
      in float lnumValue
      ) {

      /// (1) given value > 0

      if (lnumValue > 0f) {

         pnumValueCustom ~= lnumValue;

      }

   }

}
June 23, 2021

On Wednesday, 23 June 2021 at 19:53:24 UTC, someone wrote:

>

Please, look for the line marked +++

This is a structure with a public property returning a (still unsorted) range built on-the-fly from already-set properties, a basic range from a to z with n step where some specific values can be added in-between. The range is a float which I am currently using for currency (horrible) and later plan to move it to decimal 10 or the like.

[...]

sort returns a SortedRange, and I believe you wish to return a float. So you can do either return lnumRange.sort!(...).array;, or you can do lnumRange.sort!(...); return lnumRange.

June 23, 2021

On 6/23/21 6:30 PM, Jordan Wilson wrote:

>

On Wednesday, 23 June 2021 at 19:53:24 UTC, someone wrote:

>

Please, look for the line marked +++

This is a structure with a public property returning a (still unsorted) range built on-the-fly from already-set properties, a basic range from a to z with n step where some specific values can be added in-between. The range is a float which I am currently using for currency (horrible) and later plan to move it to decimal 10 or the like.

[...]

sort returns a SortedRange, and I believe you wish to return a float. So you can do either return lnumRange.sort!(...).array;, or you can do lnumRange.sort!(...); return lnumRange.

Use the release method:

return lnumRange.sort!(...).release;

-Steve

June 23, 2021

On Wednesday, 23 June 2021 at 22:30:29 UTC, Jordan Wilson wrote:

>

sort returns a SortedRange, and I believe you wish to return a float.

no, I want to return the range (full of floats) sorted -think it amount or prices or whatever

June 23, 2021

On Wednesday, 23 June 2021 at 22:46:28 UTC, Steven Schveighoffer wrote:

>

On 6/23/21 6:30 PM, Jordan Wilson wrote:

>

On Wednesday, 23 June 2021 at 19:53:24 UTC, someone wrote:

>

[...]

sort returns a SortedRange, and I believe you wish to return a float. So you can do either return lnumRange.sort!(...).array;, or you can do lnumRange.sort!(...); return lnumRange.

Use the release method:

return lnumRange.sort!(...).release;

-Steve

Wow...learn something new every day, cheers!

Jordan

June 23, 2021

On Wednesday, 23 June 2021 at 22:46:28 UTC, Steven Schveighoffer wrote:

>

Use the release method:

return lnumRange.sort!(...).release;

-Steve

Fantastic, issue solved, I previously used sort ascending even descending but first time on floats.

So I went and searched phobos docs:

auto release();
Releases the controlled range and returns it.

Not much clarification there.

Can you elaborate a bit if possible Steve ?

June 23, 2021

On 6/23/21 7:07 PM, someone wrote:

>

On Wednesday, 23 June 2021 at 22:46:28 UTC, Steven Schveighoffer wrote:

>

Use the release method:

return lnumRange.sort!(...).release;

Fantastic, issue solved, I previously used sort ascending even descending but first time on floats.

So I went and searched phobos docs:

auto release();
Releases the controlled range and returns it.

Not much clarification there.

Can you elaborate a bit if possible Steve ?

I think the purpose behind it is to say "here, now you have the original range back, so I won't guarantee it's sorted any more." I'm pretty sure it also clears out the source range in the sorted range, so you can no longer use the sortedness functions, but that's easily circumvented using save.

I can't really defend the purpose/implementation of SortedRange, it's something in Phobos that I've complained about extensively in the past.

-Steve

June 24, 2021

On Thursday, 24 June 2021 at 00:32:31 UTC, Steven Schveighoffer wrote:

>

On 6/23/21 7:07 PM, someone wrote:

>

On Wednesday, 23 June 2021 at 22:46:28 UTC, Steven Schveighoffer wrote:

>

Use the release method:

return lnumRange.sort!(...).release;

Fantastic, issue solved, I previously used sort ascending even descending but first time on floats.

So I went and searched phobos docs:

auto release();
Releases the controlled range and returns it.

Not much clarification there.

Can you elaborate a bit if possible Steve ?

I think the purpose behind it is to say "here, now you have the original range back, so I won't guarantee it's sorted any more."

I for one still don't understand.

guarantee? are you saying without the release() call, the sorted-ness is somehow guaranteed?

>

I'm pretty sure it also clears out the source range in the sorted range, so you can no longer use the sortedness functions, but that's easily circumvented using save.

This SortedRange definitely need better documentation. E.g. users can easily convert their sort() code to D from Java or Python code after reading the doc.

>

I can't really defend the purpose/implementation of SortedRange, it's something in Phobos that I've complained about extensively in the past.

(Sure, I'm not blaming you.)

June 24, 2021

On Thursday, 24 June 2021 at 00:47:28 UTC, mw wrote:

>

On Thursday, 24 June 2021 at 00:32:31 UTC, Steven Schveighoffer

This SortedRange definitely need better documentation. E.g. users can easily convert their sort() code to D from Java or Python code after reading the doc.

I think in most other popular language's std lib:

container.sort();

or

sort(container);

is just one call, and the user will expect the container is sorted after the call.

Hence, the confusion from the original post.

If D want to convert more people from other more popular languages, it's better try to make this conversion as easy as possible.

June 23, 2021
On 6/23/21 6:09 PM, mw wrote:

> I think in most other popular language's std lib:
>
> container.sort();
>
> or
>
> sort(container);
>
>
> is just one call, and the user will expect the `container` is sorted
> after the call.

That's exactly the same in D. What's different is, D's sort() does not return the original array (more generally, "random access range").

> If D want to convert more people from other more popular languages, it's
> better try to make this conversion as easy as possible.

Agreed but this is not an example of that situation. Instead of calling release(), one can return the array as well:

      import std.algorithm;
      lnumRange.sort!(r"a > b"c);
      return lnumRange;

I happen to like SortedRange. It's an interesting and useful experiment that constrains functionality. The problem with other languages, you can run "binary search" on any array (even if the array is not sorted. The correctness is left to the programmer, who is proven to be a source of bugs. Other languages will not complain at all... On the other hand, Phobos, with the help of SortedRange, protects the programmer from doing so: You can binary search only on a SortedRange, which is usually a cheap layer over an existing array or any other kind of RandomAccessRange.

As a system programmer, I appreciate assumeSorted() as well, which allows me to tell the compiler that "this array is really sorted." So, I think SortedRange is very useful.

Ali

« First   ‹ Prev
1 2