Re: 0.0 is different with 0?
- To: mathgroup at smc.vnet.net
- Subject: [mg90032] Re: 0.0 is different with 0?
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Fri, 27 Jun 2008 06:13:33 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <g3vkss$kfs$1@smc.vnet.net>
damayi wrote:
> Here is an example to show my question.
> SF[N_Integer, a_Real, fs_Real] :=
> Table[Sin[(1 + fs)*k*2 Pi/N + a], {k, 0, N - 1}]
>
> SF[32, 0.1, 0.0] can show the table contents, however, SF[32, 0.1, 0]
> cannot show the result. Why?
If you were writing this function is a strongly typed language such as
C/C++, part of the function prototype could be SF(unsigned int n, double
a, double fs) and when you call the function, the compiler would
automatically cast (if needed of course) an int into a double or issue a
warning for possible precision lost.
Now, Mathematica does not have this notion of type. However, it uses
symbolic expressions and pattern matching. In Mathematica, everything is
an expression, i.e. something of the form head[elem1, elem2, ...] (a
head and zero, one, or more elements).
In term of pattern matching, 0.0 and 0 are totally different, since
their respective head are different:
Head /@ {0., 0}
{Real, Integer}
Pattern matching does not cast a head into another head. Since the haead
of the arguments are
Head /@ SF[32, 0.1, 0]
SF[Integer, Real, Integer]
the pattern does not match the pattern given when defining the function
(the head of the third argument must be Real)
SF[N_Integer, a_Real, fs_Real]
Rather than using heads, you may want to use explicit tests to check
whether an argument is numeric or not, as in
SF[N_Integer, a_Real, fs_?NumericQ]
(Also, the computational model used by Mathematica is not the same when
you write exact numbers such as 0 (infinite precision) or machine
precision numbers such as 0.0 (a third model is also available:
arbitrary precision).)
HTH,
-- Jean-Marc