Test integerness: Difference between revisions

Content added Content deleted
m (fix mislabled language block)
(Added Wren)
Line 2,421: Line 2,421:


.. this is a fairly benign illustration of why comparing floating point values with == is usually a bad idea.
.. 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}}==
=={{header|zkl}}==