I need to nitpick here... Big O notation is a way to describe growth rates of functions. You can count data movements (or anything else) with Big O.
1,760 karma · joined September 20, 2011
I need to nitpick here... Big O notation is a way to describe growth rates of functions. You can count data movements (or anything else) with Big O.
The majority of the horizontal delta-V is produced in the second stage. The job of the first stage is to a large extent just to lift the second stage out of the densest part of the atmosphere, to minimize drag for the second stage. A plane can do the same thing, and possibly more cheaply in certain scenarios (well, that has to be Allen's plan anyway).
Improving human driving skills collectively is much more difficult. Even if one driver learns from their own mistake, other drivers and the next generation of drivers will still be just as prone as before to make that mistake. Better education can only do so much anyway, since people often don't think rationally and don't necessarily make safety the number one priority (e.g. drunk driving, trying to get to the destination as quickly as possible, or reckless driving for entertainment purposes).
void DragoonAI()
{
// Decide next move by reading main video buffer for random bits
MoveDirection = Video->buf[1000];
...
}It was created with the print edition in mind, and the web edition as a companion, rather than the other way around. Due to this focus, a lot of the content is needlessly terse.
For example, a rather useful chapter on computer algebra methods for special functions (things like holonomic functions and Zeilberger's algorithm) was written for the DLMF, but had to be discarded (in my understanding) due to page constraints on the print edition.
Also, many useful formulas are missing, and very often a case is covered as "for z < 0, combine (13.7.6) with (12.1.2) and (12.1.15)" when actually combining those formulas is half the work and the purpose of a reference is to save me trouble (and avoid potential mistakes)!
Each chapter is also written by a different author, with slight differences in the way things are organized. The good thing is that it is more than just a database of facts, with the content presented in a way that makes mathematical sense, but it can also make it more difficult to simply look up a specific fact.
My biggest gripe is that some sections of the DLMF have a very cavalier attitude when it comes to complex variables and branch cuts. A fair number of "equations" are only correct when the functions are interpreted as multivalued, and the user needs to place branch cuts the correct way. This really sucks if you need to do actual computations.
In quite a few places of the DLMF, no information about complex variables is given at all even though these are important in practice.
I often use the Wolfram Functions site (http://functions.wolfram.com/) as a complement to the DLMF, and the contrast in approach is very interesting.
The WF site is much more of a database, containing lots of more or less automatically generated entries. It is generally much more comprehensive than the DLMF, in that it allows you to look up variations and special cases of a formula in explicit form. On the other hand, it lacks most of the context and explanations provided in the DLMF.
Since the WF site content is organized completely systematically, it is very easy to find a specific formula and to compare analogous entries for different mathematical functions.
On the other hand, the WF content is harder to navigate unless you're already familiar with it. The tables of automatically generated formulas also contain a fair number of "junk" entries that no human would ever find useful.
The WF site is completely explicit about branch cuts (which makes sense since the Mathematica designers care about actual computations).
I have found some errors in the WF site, but they are quite rare. The Wolfram people actually use numerical "unit tests" for the formulas (checking identities numerically for carefully chosen values of the variables in order to verify correct use of branch cuts etc).
One of the Mathematica developers responsible for the WF site was actually present at a DLMF development meeting which took place in connection with a conference at NIST a couple of years ago, and he gave the DLMF editors a bit of a scolding about the branch cut issue, but not much happened. There's a bit of difference in philosophy: viewing a special function as a more abstract thing vs fixing concrete branch cuts.
A third interesting approach to a special functions resource is the Dynamic Dictionary of Mathematical Functions (http://ddmf.msr-inria.inria.fr/1.9.1/ddmf) which is even more automated than the WF site.
In the DDMF, a function is defined by a differential or difference equation, and all theorems and formulas are essentially generated algorithmically from first principles! Very neat. But the content that can be generated automatically this way is still quite limited compared to completely human-curated resources.
It wouldn't be too much of a stretch to detect and optimise away code that computes linearly recurrent sequences.
The "bug" here is that a single operation x + 0.1 and x + 0.1 can give two different results depending on the mood of the compiler.
It's not actually a bug, because the IEEE 754 standard permits this kind of sloppiness by default. You can get stricter semantics, but you have to ask for it explicitly by setting the right compiler flags. This is why I say that the IEEE 754 standard makes floating-point arithmetic deterministic "in principle" - in practice, you have to work for it. (Changes to the rounding mode are another big issue here.)
An extra error of 1 ulp somewhere might not seem like much for your average numerical code, but it's a big deal in some situations:
* Assumptions about the precise behavior of floating-point cancellations are often used in numerical libraries, and deviations can cause disastrous loss of accuracy. For example, Kahan summation is a widely used algorithm for computing sums with increased accuracy. If compilers optimize the code too aggressively, the algorithm doesn't work and you get worse accuracy. And ironically, x87 long doubles can make general numerical calculations less accurate (not more accurate as intended) due to the double rounding issue.
* If you use floats in game logic, you might want it to behave exactly the same way on different platforms, e.g. for synchronization or replays.
* In scientific computing, you might want results to be precisely reproducible by others.
* Debugging!
Indeed, a calf can walk within hours of being born. A human infant might need more time than a calf in part because walking on two legs is harder than walking on four, but much of the difference simply comes down to the fact that humans are born so early that a lot of predetermined brain development has not yet occurred (the muscles and bones are also too weak). The study [1] found that across varying mammalian species, walking is learned a predictable amount of time after conception (as opposed to time after birth).
There's a surely a continuum between brain functions that are completely hard wired and completely learned from scratch. I think it's accurate to say that for many functions, learning is used as a form of adaptive refinement to finalize specific predetermined neural programs. But the exact interaction between learning and pre-programming isn't well understood in most cases.