Why doesn't
1.0 = 2.0work? Isn't real an equality type?It gives the error:
Error: operator and operand don't agree [equality type required] operator domain: ''Z * ''Z operand: real * real in expression: 1.0 = 2.0Why won't reals in patterns work like so?
fun fact 0.0 = 1.0 | fact x = x * fact (x - 1.0)It gives the error:
Error: syntax error: inserting EQUALOP
Why can't I compare reals in Standard ML?
3.6k Views Asked by sshine At
1
There are 1 best solutions below
Related Questions in FLOATING-POINT
- Significant digits with IEEE 754 float
- Randomizing values accounting for floating point resolution
- Why is this floating point addition result not correct?
- Numerical issue with np.exp()
- Converting float to uint64 and uint32 behaves strangely
- Addition of floating point, Why the First code work
- how divided integer is converted to floating point number with decimal
- Trouble outputting Float value using Jackson library for Java
- Simple and clean java float to string conversion
- Does OCaml have C-like round() and trunc() functions?
- Splitting a floating point number into a sum of two other numbers, without rounding errors
- How to tell if up to floating point round-off, 4 2-d points might lie on a common circle?
- Is it always safe to negate a floating point number
- Why is the value of 1**Inf equal to 1, not NaN?
- Check if given number is Even, Odd or Neither in PHP?
Related Questions in SML
- SML - Find same elements in a string
- ML currying and anonymous functions
- Standard ML / NJ: Loading in file of functions
- SML - Unzip tuples in one list
- mlton gives library-related error
- Functors with multiple inputs in Standard ML
- Standard ML: Getting Last in List
- Standard ML: Iterative vs. Recursive
- Wildcards in Standard ML
- SML - Find element in a list and substitute it
- How to keep elements in list through out the program in SML?
- Why to replace `in` with `let` in sml?
- Why can't I compare reals in Standard ML?
- sml map and structure using recursion
- ML-Error in using exceptions
Related Questions in SMLNJ
- How to keep elements in list through out the program in SML?
- Why to replace `in` with `let` in sml?
- Why can't I compare reals in Standard ML?
- ML-Error in using exceptions
- Can not run REPL sml-mode in Emacs (Mac)
- Increase print depth for lists in SML/NJ
- SML/NJ Error: operator and operand don't agree
- Moving elements in a priority queue to a lower level
- How to get element of new type in ML?
- SML : Dequeue a list of tuples
- Format exception SML
- SML: How to separate a list into a tuple of 2 lists?
- SML finding a sum of squares/halves using other functions
- Implementing next_permutation in sml?
- How to easily shuffle a list in sml?
Related Questions in FLOATING-POINT-COMPARISON
- Comparing doubles properly using aliasing with integer representations and ULPs
- Why can't I compare reals in Standard ML?
- Issue in floating point comparison leads to incorrect query result in DolphinDB GUI
- Floating-point arithemtic in C: epsilon comparison
- Floating point operations results are different in Android, TensorFlow and Pytorch
- Redis: using ZRANGE to search for a single value?
- Can we use !islessgreater(float a, float b) to check a==b given both a and b are not nan
- In C++, is exactly one of <, == and > guaranteed to be true on floats?
- Checking if a specific float value is in list/array in Python/numpy
- How to evaluate whether two number are close enough or not in Python?
- How to tell rust to do all float comparisons using a given lib by default?
- What's the difference between identical(x, y) and isTRUE(all.equal(x, y))?
- Floating point equality
- Java List.contains object with double with tolerance
- Does multiplying a floating point number by 0 always yield 0?
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
No. The type variable
''Zindicates that the operands of=must have equality types.Pattern matching relies implicitly on testing for equality. The cryptic error message
syntax error: inserting EQUALOPindicates that the SML/NJ parser does not allow for floating-point literals where a pattern is expected, and so the programmer is prevented from receiving a more meaningful type error.To elaborate,
From http://www.smlnj.org/doc/FAQ/faq.txt:
From http://mlton.org/PolymorphicEquality:
For example,
Real.== (0.1 + 0.2, 0.3)isfalse.From http://sml-family.org/Basis/real.html:
The short version: Don't compare reals using equality. Perform an epsilon test. I would recommend reading the article on http://floating-point-gui.de/errors/comparison. In summary:
Don't check if reals are the same, but if the difference is very small.
The error margin that the difference (delta) is compared to is often called epsilon.
Don't compare the difference against a fixed epsilon:
Don't just compare the relative difference against epsilon:
Look out for edge cases:
When
b = 0.0it raisesDiv. (Switchingaandbprovides a symmetric edge case.)When
aandbare on opposite sides of zero it returnsfalseeven when they’re the smallest possible non-zero numbers.The result is not commutative. There are cases where
nearlyEqual (a, b, eps)does not give the same result asnearlyEqual (b, a, eps).The guide provides a generic solution; translated to Standard ML this looks like:
And it continues to warn of some edge cases: