Jump to content

Test integerness: Difference between revisions

Added Wren
m (fix mislabled language block)
(Added Wren)
Line 2,421:
 
.. this is a fairly benign illustration of why comparing floating point values with == is usually a bad idea.
 
=={{header|Wren}}==
{{libheader|Wren-big}}
{{libheader|Wren-complex}}
{{libheader|Wren-rat}}
{{libheader|Wren-fmt}}
The -2e120 example requires the use of BigRat to reliably determine whether it's an integer or not. Although the Num class can deal with numbers of this size and correctly identifies it as an integer, it would do the same if (say) 0.5 were added to it because integer determination is only reliable up to around 15 digits.
<lang ecmascript>import "/big" for BigRat
import "/complex" for Complex
import "/rat" for Rat
import "/fmt" for Fmt
 
var tests1 = [25.000000, 24.999999, 25.000100]
var tests2 = ["-2.1e120"]
var tests3 = [-5e-2, 0/0, 1/0]
var tests4 = [Complex.fromString("5.0+0.0i"), Complex.fromString("5-5i")]
var tests5 = [Rat.new(24, 8), Rat.new(-5, 1), Rat.new(17, 2)]
var tests6 = tests1 + [-5e-2]
 
System.print("Using exact arithmetic:\n")
for (t in tests1) {
Fmt.print(" $-9.6f is integer? $s", t, t.isInteger)
}
System.print()
for (t in tests2) {
Fmt.print(" $-9s is integer? $s", t, BigRat.new(t, 1).isInteger)
}
for (t in tests3) {
Fmt.print(" $-9.6f is integer? $s", t, t.isInteger)
}
System.print()
for (t in tests4) {
Fmt.print(" $-9s is integer? $s", t, t.real.isInteger && t.imag == 0)
}
System.print()
for (t in tests5) {
Fmt.print(" $-9s is integer? $s", t, t.isInteger)
}
System.print("\nWithin a tolerance of 0.00001:\n")
var tol = 0.00001
for (t in tests6) {
var d = (t - t.round).abs
Fmt.print(" $9.6f is integer? $s", t, d <= tol)
}</lang>
 
{{out}}
<pre>
Using exact arithmetic:
 
25.000000 is integer? true
24.999999 is integer? false
25.000100 is integer? false
 
-2.1e120 is integer? true
-0.050000 is integer? false
nan is integer? false
infinity is integer? false
 
5 + 0i is integer? true
5 - 5i is integer? false
 
3/1 is integer? true
-5/1 is integer? true
17/2 is integer? false
 
Within a tolerance of 0.00001:
 
25.000000 is integer? true
24.999999 is integer? true
25.000100 is integer? false
-0.050000 is integer? false
</pre>
 
=={{header|zkl}}==
9,485

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.