NumberQ and NumericQ
NumberQ is more restrictive than NumericQ and seems to be True only if the evaluated expression is explicitly a number, while NumericQ tests for a "numeric quantity," which seems to mean that Mathematica tests each component to see if its fully evaluated form is a number. NumberQ probably also contains exceptions that should be considered "numeric," for instance all of the built-in numerical constants. More Predicates are implicit in built-in defined sets, such as Rationals and Reals (see below).
NumberQ@3.14159
True
NumberQ@Pi
False
NumericQ@Pi
True
NumberQ@Sqrt@2
False
Both Predicates will test a compound expression, but only NumericQ will test the fully evaluated form of each component. If any component evaluates False by NumberQ, the whole expression evaluates as False.
NumberQ[Sqrt@2 + 5]
False
NumericQ[Sqrt@2 + 5]
True
NumberQ@Sin@Sqrt@2
False
Since in the end the sine of the square root of 2 evaluates to a Real, NumericQ tests it as True; in effect it's testing 0.987766, while NumberQ cannot see the evaluated form.
Sin@Sqrt@2 // N
0.987766
NumericQ@Sin@Sqrt@2
True
Equal (==) and SameQ (===)
The distinction between these two Predicates can be confusing, but the basic idea is Equal tests for numeric equality while SameQ tests for syntactical equality. There are subtleties; here Mathematica compares Pi using its internal storage form.
N[Pi, 4] == N[Pi, 6]
True
However if we compare explicitly different numbers Equal will return False.
3.141 == 3.14159
False
SameQ will pick up syntactic differences that Equal misses.
Pi === N[Pi, 5]
False
Here is a nice example from a good introduction to Mathematica by Nancy Blachman and Colin Williams of using SameQ to test syntax in a paradigm for testing user input for a correctness (Mathematica, A Practical Introduction, 2nd ed., p 433, syntax modifications mine).
testUser1[question_, correctAnswer_] :=
Module[{userAnswer = Input@question},
If[userAnswer === correctAnswer, Print@"Correct!",
Print["You said ", userAnswer, " but the correct answer is ",
correctAnswer] ]
]
testUser1["What is Newton's second law of motion?", f = ma]
Correct!
It is easy to see how using Equal or StringMatchQ would give different tests for equality ("What is the square root of 2?") or an exact string match ("What is the largest continent?") in user input.
Part 3 will show how to build and use your own user-defined Predicates.
NumberQ is more restrictive than NumericQ and seems to be True only if the evaluated expression is explicitly a number, while NumericQ tests for a "numeric quantity," which seems to mean that Mathematica tests each component to see if its fully evaluated form is a number. NumberQ probably also contains exceptions that should be considered "numeric," for instance all of the built-in numerical constants. More Predicates are implicit in built-in defined sets, such as Rationals and Reals (see below).
NumberQ@3.14159
True
NumberQ@Pi
False
NumericQ@Pi
True
NumberQ@Sqrt@2
False
Both Predicates will test a compound expression, but only NumericQ will test the fully evaluated form of each component. If any component evaluates False by NumberQ, the whole expression evaluates as False.
NumberQ[Sqrt@2 + 5]
False
NumericQ[Sqrt@2 + 5]
True
NumberQ@Sin@Sqrt@2
False
Since in the end the sine of the square root of 2 evaluates to a Real, NumericQ tests it as True; in effect it's testing 0.987766, while NumberQ cannot see the evaluated form.
Sin@Sqrt@2 // N
0.987766
NumericQ@Sin@Sqrt@2
True
Equal (==) and SameQ (===)
The distinction between these two Predicates can be confusing, but the basic idea is Equal tests for numeric equality while SameQ tests for syntactical equality. There are subtleties; here Mathematica compares Pi using its internal storage form.
N[Pi, 4] == N[Pi, 6]
True
However if we compare explicitly different numbers Equal will return False.
3.141 == 3.14159
False
SameQ will pick up syntactic differences that Equal misses.
Pi === N[Pi, 5]
False
Here is a nice example from a good introduction to Mathematica by Nancy Blachman and Colin Williams of using SameQ to test syntax in a paradigm for testing user input for a correctness (Mathematica, A Practical Introduction, 2nd ed., p 433, syntax modifications mine).
testUser1[question_, correctAnswer_] :=
Module[{userAnswer = Input@question},
If[userAnswer === correctAnswer, Print@"Correct!",
Print["You said ", userAnswer, " but the correct answer is ",
correctAnswer] ]
]
testUser1["What is Newton's second law of motion?", f = ma]
Correct!
It is easy to see how using Equal or StringMatchQ would give different tests for equality ("What is the square root of 2?") or an exact string match ("What is the largest continent?") in user input.
Part 3 will show how to build and use your own user-defined Predicates.
No comments:
Post a Comment