Real Close to the Machine: Floating Point in D
Lars T. Kyllingstad
public at kyllingen.NOSPAMnet
Thu May 14 23:58:53 PDT 2009
Don wrote:
> Lars T. Kyllingstad wrote:
>> Don wrote:
>>> Lars T. Kyllingstad wrote:
>>>> Don wrote:
>>>>> Luís Marques wrote:
>>>>>>> A naive binary chop doesn't work correctly. The fact that there
>>>>>>> are hundreds or thousands of times as many representable numbers
>>>>>>> between 0 and 1, as there are between 1 and 2, is problematic for
>>>>>>> divide-and-conquer algorithms. A naive binary chop would divide
>>>>>>> the interval [0 .. 2] into [0 .. 1] and [1 .. 2]. Unfortunately,
>>>>>>> this is not a true binary chop, because the interval [0 .. 1]
>>>>>>> contains more than 99% of the representable numbers from the
>>>>>>> original interval!
>>>>>>
>>>>>> How about adding a template to do a binary chop (binary search?)
>>>>>> to std.algorithm?
>>>>>
>>>>> findRoot() (which needs to be updated to take advantage of compiler
>>>>> improvements) does the job in the most important case. I'm quite
>>>>> proud of it; as far as I know, it's uses a better algorithm than
>>>>> anything else on the planet. <g>
>>>>
>>>>
>>>> Awesome! I hadn't even noticed the std.numeric module before. :)
>>>>
>>>> Just a small comment: I think that the type of the function
>>>> parameter should be templated as well, so that one can pass both
>>>> functions, delegates and functors to it.
>>>>
>>>> Just now I tried to apply findRoot to an actual problem I'm working
>>>> on, and immediately failed because I tried to pass a free function
>>>> to it. A trivial thing to work around, but annoying nevertheless.
>>>>
>>>> How do you choose/limit what to put in std.numeric? I don't suppose
>>>> you're going to put all of NETLIB in there... ;) Already, it seems
>>>> to me that findRoot is somewhat niche for a standard library.
>>>
>>> I think it's one of a very small number of primitive math algorithms.
>>> It shows up _very_ frequently.
>>>
>>> In Tango, it's in tango.math.Bracket, along with a 1-D maximizer.
>>> (math.Bracket isn't a name I like very much).
>>> There's definitely an issue with Phobos' flat module organisation;
>>> it's not clear that Phobos can sensibly grow to be much more
>>> extensive than (say) the C standard library or the STL with that kind
>>> of structure.
>>> I'm convinced that implementation modules, at least, will need to go
>>> somewhere else.
>>
>>
>> In my numerics library (which I've, in all modesty, named SciD) I'm
>> converging on a package structure I'm fairly pleased with:
>>
>> scid.core:
>> Internal modules, such as scid.core.traits, scid.core.tests,
>> scid.core.exception, etc.
>>
>> scid.ports:
>> Here I put ports of various packages from NETLIB and other
>> sources. Examples of subpackages are scid.minpack,
>> scid.quadpack, etc. These have, for the most part, rather
>> nasty APIs, and should normally not be used directly.
>>
>> scid:
>> In the root package I've placed the most ubiquitous modules,
>> i.e. scid.vector, scid.transformation, etc.
>>
>> scid.calculus
>> scid.calculus.differentiation
>> scid.calculus.integration
>> ...
>> scid.linalg
>> ...
>> scid.nonlinear
>> ...
>> Specific problem areas get their own subpackages. At the moment
>> these mostly just contain nicer interfaces to the routines in
>> scid.ports -- "drivers", if you will.
>>
>> I've tried a lot of setups, and this is the one I've found most
>> flexible. The hierarchy isn't as shallow (and inextensible) as
>> Phobos', nor is it as deep (and unwieldly) as Tango's.
>
> That sounds about right. But you might even consider dropping it down
> one level. For example, everyone knows that differentiation is
> calculus.differentiation; I think you only need a level when the module
> name is ambiguous on its own. (std.integration might be about Product
> Integration or something; but math.integration is unambiguous).
Thanks, I'll keep that in mind. At one point I had to use several levels
because I kept interfaces and implementations in the same modules, and
the source files quickly became very large. Now that I've put the
implementations in scid.ports, using one level is a lot more manageable.
Whether I choose to use one or two levels, the idea is to mimic the
structure of the GAMS classification tree.
-Lars
More information about the Digitalmars-d
mailing list