Test integerness: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) 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}}== |