RosettaCodeData/Task/Approximate-equality/Tcl/approximate-equality-1.tcl
2023-07-01 13:44:08 -04:00

35 lines
1.2 KiB
Tcl

catch {namespace delete test_almost_equal_decimal} ;# Start with a clean namespace
namespace eval test_almost_equal_decimal {
package require Tcl 8.5 ;# required by tcllib
package require math::decimal ;# from tcllib
namespace import ::math::decimal::* ;# for: setVariable, fromstr, and compare
array set yesno {0 Yes -1 No 1 No} ;# For nice output
# More info here: http://speleotrove.com/decimal/dax3274.html
# This puts the library into "simplified" mode. Which
# rounds the "decimal digits" in the coefficient to the
# number of digits that "precision" is set to.
setVariable extended 0
setVariable precision 9
set data {
{100000000000000.01 100000000000000.011}
{100.01 100.011}
{[expr {10000000000000.001 / 10000.0}] 1000000000.0000001000}
{0.001 0.0010000001}
{0.000000000000000000000101 0.0}
{[expr { sqrt(2) * sqrt(2)}] 2.0}
{[expr {-sqrt(2) * sqrt(2)}] -2.0}
{3.14159265358979323846 3.14159265358979324}
}
set data [subst $data] ;# resolves expressions in the list
foreach {a b} [join $data] {
set a_d [fromstr $a]
set b_d [fromstr $b]
puts [format "Is %26s %21s ? %4s." $a $b $yesno([compare $a_d $b_d])]
}
}