# exact.test -- # # Test cases for the math::exact package # # Copyright (c) 2015 by Kevin B. Kenny # # See the file "license.terms" for information on usage and redistribution of # this file, and for a DISCLAIMER OF ALL WARRANTIES. # #----------------------------------------------------------------------------- source [file join \ [file dirname [file dirname [file join [pwd] [info script]]]] \ devtools testutilities.tcl] testsNeedTcl 8.6 testsNeedTcltest 2.3 support { use grammar_aycock/aycock-runtime.tcl grammar::aycock::runtime grammar::aycock useKeep grammar_aycock/aycock-debug.tcl grammar::aycock::debug grammar::aycock useKeep grammar_aycock/aycock-build.tcl grammar::aycock grammar::aycock } testing { useLocal exact.tcl math::exact } package require Tcl 8.6 package require grammar::aycock 1.0 package require math::exact 1.0.1 #----------------------------------------------------------------------------- namespace eval math::exact::test { namespace import ::math::exact::exactexpr proc signum {x} {expr {($x > 0) - ($x < 0)}} proc leakBaseline {} { variable leakBaseline foreach o [info commands ::oo::Obj*] { dict set leakBaseline $o {} } return } proc leakCheck {} { variable leakBaseline set trouble {} set sep {} foreach o [lsort -dictionary [info commands ::oo::Obj*]] { if {![dict exists $leakBaseline $o]} { if {[info object isa typeof $o math::exact::counted]} { append trouble $sep "Leaked counted object " \ $o ": " [$o dump] \n } else { append trouble $sep "Leaked object " $o \n } } } if {$trouble ne {}} { return -code error -errorcode {LEAKCHECK} $trouble } return } namespace import ::tcltest::test test math::exact-1.0 {unit test gcd} { math::exact::gcd 2 } 2 test math::exact-1.1 {unit test gcd} { math::exact::gcd 2 0 } 2 test math::exact-1.2 {unit test gcd} { math::exact::gcd 0 2 } 2 test math::exact-1.3 {unit test gcd} { math::exact::gcd 2 3 } 1 test math::exact-1.4 {unit test gcd} { math::exact::gcd 3 2 } 1 test math::exact-1.5 {unit test gcd} { math::exact::gcd 21 12 } 3 test math::exact-1.6 {unit test gcd} { math::exact::gcd 12 21 } 3 test math::exact-1.5 {unit test gcd} { math::exact::gcd 21 12 } 3 test math::exact-1.6 {unit test gcd} { math::exact::gcd 12 21 } 3 test math::exact-1.7 {unit test gcd} { math::exact::gcd 108 66 } 6 test math::exact-1.8 {unit test gcd} { math::exact::gcd 66 108 } 6 test math::exact-1.9 {unit test gcd} { math::exact::gcd 66 108 88 } 2 test math::exact-2.0 {unit test transpose matrix} { math::exact::trans {{0 1} {2 3}} } {{0 2} {1 3}} test math::exact-2.1 {unit test transpose 2x2x2} { math::exact::trans {{{0 1} {2 3}} {{4 5} {6 7}}} } {{{0 1} {4 5}} {{2 3} {6 7}}} test math::exact-3.1 {unit test determinant} { math::exact::determinant {{2 3} {5 7}} } -1 test math::exact-4.1 {unit test reverse} { math::exact::reverse {{2 3} {5 7}} } {{7 -3} {-5 2}} test math::exact-5.1 {unit test veven} { math::exact::veven {2 4} } 1 test math::exact-5.2 {unit test veven} { math::exact::veven {2 3} } 0 test math::exact-6.1 {unit test meven} { math::exact::meven {{2 4} {6 8}} } 1 test math::exact-6.2 {unit test meven} { math::exact::meven {{2 3} {6 8}} } 0 test math::exact-7.1 {unit test teven} { math::exact::teven {{{2 4} {6 8}} {{10 12} {14 16}}} } 1 test math::exact-7.2 {unit test teven} { math::exact::teven {{{2 4} {6 8}} {{10 13} {14 16}}} } 0 test math::exact-8.1 {unit test vhalf} { math::exact::vhalf {6 8} } {3 4} test math::exact-9.1 {unit test mhalf} { math::exact::mhalf {{6 8} {10 12}} } {{3 4} {5 6}} test math::exact-10.1 {unit test thalf} { math::exact::thalf {{{6 8} {10 12}} {{14 16} {18 20}}} } {{{3 4} {5 6}} {{7 8} {9 10}}} test math::exact-11.1 {unit test sign} { set trouble {} set sep \n for {set a -1} {$a <= 1} {incr a} { for {set b -1} {$b <= 1} {incr b} { if {$a ==0 && $b == 0} { set sb 0 } elseif {$a == 0} { set sb [signum $b] } elseif {$b == 0} { set sb [signum $a] } elseif {$a/$b < 0} { set sb 0 } else { set sb [signum $a] } set is [math::exact::sign [list $a $b]] if {$is != $sb} { append trouble "sign(" $a "," $b ") is " $is \ ", should be " $sb "\n" } } } set trouble } {} test math::exact-12.1 {unit test vrefines} { set trouble {} set sep {} for {set a -1} {$a <= 1} {incr a} { for {set b -1} {$b <= 1} {incr b} { if {$a ==0 && $b == 0} { set sb 0 } elseif {$a == 0} { set sb 1 } elseif {$b == 0} { set sb 1 } elseif {$a/$b < 0} { set sb 0 } else { set sb 1 } set is [math::exact::vrefines [list $a $b]] if {$is != $sb} { append trouble $sep "vrefines(" $a "," $b ") is " $is \ ", should be " $sb set sep \n } } } set trouble } {} test math::exact-13.1 {unit test mrefines} { math::exact::mrefines {{1 2} {3 4}} } 1 test math::exact-13.2 {unit test mrefines} { math::exact::mrefines {{1 2} {-3 -4}} } 0 test math::exact-13.3 {unit test mrefines} { math::exact::mrefines {{-1 -2} {-3 -4}} } 1 test math::exact-13.4 {unit test mrefines} { math::exact::mrefines {{-1 2} {-3 4}} } 0 test math::exact-14.1 {unit test trefines} { math::exact::trefines {{{1 2} {3 4}} {{5 6} {7 8}}} } 1 test math::exact-14.2 {unit test trefines} { math::exact::trefines {{{-1 -2} {-3 -4}} {{-5 -6} {-7 -8}}} } 1 test math::exact-14.3 {unit test trefines} { math::exact::trefines {{{-1 2} {-3 4}} {{-5 6} {-7 8}}} } 0 test math::exact-14.4 {unit test trefines} { math::exact::trefines {{{1 2} {3 4}} {{5 6}} {{-7 -8}}} } 0 test math::exact-14.5 {unit test trefines} { math::exact::trefines {{{1 2} {3 4}} {{-5 -6}} {{-7 -8}}} } 0 test math::exact-14.6 {unit test trefines} { math::exact::trefines {{{1 2} {-3 -4}} {{-5 -6}} {{-7 -8}}} } 0 test math::exact-15.1 {unit test vlessv} { set intervals { {-1 0} {-2 1} {-1 1} {-1 2} {0 1} {2 4} {3 3} {14 7} {1 0} } set trouble {} set sep {} set i 0 foreach a $intervals { set j 0 foreach b $intervals { set is [math::exact::vlessv $a $b] if {[lindex $a 1] == 0 && [lindex $b 1] == 0} { set sb 0 } else { set sb [expr {$i < $j}] } if {$is != $sb} { append trouble $sep "vlessv(" $a ";" $b ") is " $is \ " should be " $sb set sep \n } incr j } incr i } set trouble } {} test math::exact-16.1 {unit test mlessm - also tests mlessv} { set intervals { {-2 1} {-1 1} {-1 2} {0 1} {2 4} {3 3} {14 7} {1 0} } set trouble {} set sep {} set i 0 foreach a $intervals { set j $i foreach b [lrange $intervals $i end] { set k 0 foreach c $intervals { set l $k foreach d [lrange $intervals $k end] { if {[lindex $b 1] == 0 && [lindex $c 1] == 0} { set sb 0 } else { set sb [expr {$j < $k}] } set is [math::exact::mlessm [list $b $a] [list $d $c]] if {$is != $sb} { append trouble $sep "mlessm(" $a "," $b ";" \ $c "," $d ") is " $is \ " should be " $sb " -- " \ [list i $i j $j k $k l $k] set sep \n } incr l } incr k } incr j } incr i } set trouble } {} test math::exact-17.1 {unit test vscale} { math::exact::vscale {2 3} } {2 3} test math::exact-17.2 {unit test vscale} { math::exact::vscale {4 6} } {2 3} test math::exact-17.1 {unit test vscale} { math::exact::vscale {8 12} } {2 3} test math::exact-18.1 {unit test mscale} { math::exact::mscale {{2 3} {4 5}} } {{2 3} {4 5}} test math::exact-18.2 {unit test mscale} { math::exact::mscale {{4 6} {8 10}} } {{2 3} {4 5}} test math::exact-18.3 {unit test mscale} { math::exact::mscale {{8 12} {16 20}} } {{2 3} {4 5}} test math::exact-19.1 {unit test tscale} { math::exact::tscale {{{2 3} {4 5}} {{6 7} {8 9}}} } {{{2 3} {4 5}} {{6 7} {8 9}}} test math::exact-19.2 {unit test tscale} { math::exact::tscale {{{4 6} {8 10}} {{12 14} {16 18}}} } {{{2 3} {4 5}} {{6 7} {8 9}}} test math::exact-10.3 {unit test tscale} { math::exact::tscale {{{8 12} {16 20}} {{24 28} {32 36}}} } {{{2 3} {4 5}} {{6 7} {8 9}}} test math::exact-20.1 {unit test vreduce} { math::exact::vreduce {2 3} } {2 3} test math::exact-20.2 {unit test vreduce} { math::exact::vreduce {4 6} } {2 3} test math::exact-20.1 {unit test vreduce} { math::exact::vreduce {8 12} } {2 3} test math::exact-21.1 {unit test mreduce} { math::exact::mreduce {{2 3} {4 5}} } {{2 3} {4 5}} test math::exact-21.2 {unit test mreduce} { math::exact::mreduce {{4 6} {8 10}} } {{2 3} {4 5}} test math::exact-21.3 {unit test mreduce} { math::exact::mreduce {{8 12} {16 20}} } {{2 3} {4 5}} test math::exact-22.1 {unit test treduce} { math::exact::treduce {{{2 3} {4 5}} {{6 7} {8 9}}} } {{{2 3} {4 5}} {{6 7} {8 9}}} test math::exact-22.2 {unit test treduce} { math::exact::treduce {{{4 6} {8 10}} {{12 14} {16 18}}} } {{{2 3} {4 5}} {{6 7} {8 9}}} test math::exact-22.3 {unit test treduce} { math::exact::treduce {{{8 12} {16 20}} {{24 28} {32 36}}} } {{{2 3} {4 5}} {{6 7} {8 9}}} test math::exact-23.1 {unit test mdotv} { math::exact::mdotv {{2 3} {4 5}} {10 1} } {24 35} test math::exact-24.1 {unit test mdotm} { math::exact::mdotm {{2 3} {4 5}} {{1000 10} {100 1}} } {{2040 3050} {204 305}} test math::exact-25.1 {unit test mdott} { math::exact::mdott {{1000 10} {100 1}} {{{2 3} {4 5}} {{6 7} {8 9}}} } {{{2300 23} {4500 45}} {{6700 67} {8900 89}}} test math::exact-26.1 {unit test tleftv} { math::exact::tleftv {{{2 3} {4 5}} {{6 7} {8 9}}} {10 1} } {{26 37} {48 59}} test math::exact-27.1 {unit test trightv} { math::exact::trightv {{{2 3} {4 5}} {{6 7} {8 9}}} {10 1} } {{24 35} {68 79}} test math::exact-28.1 {unit test tleftm} { math::exact::tleftm {{{2 3} {4 5}} {{6 7} {8 9}}} {{1000 10} {100 1}} } {{{2060 3070} {4080 5090}} {{206 307} {408 509}}} test math::exact-29.1 {unit test trightm} { math::exact::trightm {{{2 3} {4 5}} {{6 7} {8 9}}} {{1000 10} {100 1}} } {{{2040 3050} {204 305}} {{6080 7090} {608 709}}} test math::exact-30.1 {unit test mdisjointm} { set intervals { {-2 1} {-1 1} {-1 2} {0 1} {2 4} {3 3} {14 7} {1 0} } set trouble {} set sep {} set i 0 foreach a $intervals { set j $i foreach b [lrange $intervals $i end] { set k 0 foreach c $intervals { set l $k foreach d [lrange $intervals $k end] { set sb [expr {$j < $k || $l < $i}] set is [math::exact::mdisjointm \ [list $b $a] [list $d $c]] if {$is != $sb} { append trouble $sep "mdisjointm(" $a "," $b ";" \ $c "," $d ") is " $is \ " should be " $sb " -- " \ [list i $i j $j k $k l $k] set sep \n } incr l } incr k } incr j } incr i } set trouble } {} test math::exact-31.0 {mAsFloat, rational} { math::exact::mAsFloat {{1 3} {1 3}} } 1/3 test math::exact-31.1 {mAsFloat, scientificNotation, mantissa, eFormat} { set p 0 set q 1 set res {} for {set i 0} {$i < 16} {incr i} { set r [expr {$p + $q}] if {$q * $q > $p * $r} { set m [list [list $q $p] \ [list $r $q]] } else { set m [list [list $r $q] \ [list $q $p]] } lappend res [math::exact::mAsFloat $m] set p $q set q $r } set res } [list \ Undetermined 1.e0 1.e0 1.6e0 1.6e0 1.6e0 1.62e0 1.61e0 1.61e0 \ 1.618e0 1.618e0 1.6180e0 1.6180e0 1.61803e0 1.61803e0 1.61803e0] test math::exact-31.2 {mAsFloat, scientificNotation, mantissa, eFormat} { set p 0 set q 1 set res {} for {set i 0} {$i < 16} {incr i} { set r [expr {$p + $q}] if {$q * $q > $p * $r} { set m [list [list [expr {1000*$q}] $p] \ [list [expr {1000*$r}] $q]] } else { set m [list [list [expr {1000*$r}] $q] \ [list [expr {1000*$q}] $p]] } lappend res [math::exact::mAsFloat $m] set p $q set q $r } set res } [list \ Undetermined 1.e3 1.e3 1.6e3 1.6e3 1.6e3 1.62e3 1.61e3 1.61e3 \ 1.618e3 1.618e3 1.6180e3 1.6180e3 1.61803e3 1.61803e3 1.61803e3] test math::exact-31.3 {mAsFloat, scientificNotation, mantissa, eFormat} { set p 0 set q 1 set res {} for {set i 0} {$i < 16} {incr i} { set r [expr {$p + $q}] if {$q * $q > $p * $r} { set m [list [list $q [expr {1000*$p}]] \ [list $r [expr {1000*$q}]]] } else { set m [list [list $r [expr {1000*$q}]] \ [list $q [expr {1000*$p}]]] } lappend res [math::exact::mAsFloat $m] set p $q set q $r } set res } [list \ Undetermined 1.e-3 1.e-3 1.6e-3 1.6e-3 \ 1.6e-3 1.62e-3 1.61e-3 1.61e-3 \ 1.618e-3 1.618e-3 1.6180e-3 1.6180e-3 \ 1.61803e-3 1.61803e-3 1.61803e-3] test math::exact-31.4 {mAsFloat, scientificNotation, mantissa, eFormat} { set p 0 set q 1 set res {} for {set i 0} {$i < 16} {incr i} { set r [expr {$p + $q}] set mq [expr {-$q}] set mr [expr {-$r}] if {$q * $q > $p * $r} { set m [list [list $mq $p] \ [list $mr $q]] } else { set m [list [list $mr $q] \ [list $mq $p]] } lappend res [math::exact::mAsFloat $m] set p $q set q $r } set res } [list \ Undetermined -2.e0 -2.e0 -1.6e0 \ -1.7e0 -1.7e0 -1.62e0 -1.62e0 \ -1.62e0 -1.618e0 -1.618e0 -1.6180e0 \ -1.6181e0 -1.61803e0 -1.61804e0 -1.61804e0] test math::exact-31.5 {mAsFloat, 0/0} { math::exact::mAsFloat {{0 0} {0 0}} } NaN test math::exact-31.6 {mAsFloat, infinity} { math::exact::mAsFloat {{1 0} {1 0}} } Inf test math::exact-31.7 {mAsFloat, zero} { math::exact::mAsFloat {{0 1} {0 1}} } 0 test math::exact-31.8 {mAsFloat, integer} { math::exact::mAsFloat {{2 1} {2 1}} } 2 test math::exact-31.9 {mAsFloat, reverse signs} { list [math::exact::mAsFloat {{2 -1} {2 -1}}] \ [math::exact::mAsFloat {{-2 -1} {-2 -1}}] } {-2 2} test math::exact-40.1 {simple expr} { -setup leakBaseline -body { set v [[exactexpr {1}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.0000000000000000e0} } test math::exact-40.2 {unary plus} { -setup leakBaseline -body { set v [[exactexpr {+ 1}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.0000000000000000e0} } test math::exact-40.3 {unary minus} { -setup leakBaseline -body { set v [[exactexpr {- 1}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {-1 -9.999999999999999e-1} } test math::exact-40.4 {product} { -setup leakBaseline -body { set v [[exactexpr {2 * 3}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {6 6.000000000000000e0} } test math::exact-40.5 {quotient} { -setup leakBaseline -body { set v [[exactexpr {2 / 3}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {2/3 6.666666666666666e-1} } test math::exact-40.6 {associativity of /} { -setup leakBaseline -body { set v [[exactexpr {2 / 3 / 4}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {1/6 1.6666666666666667e-1} } test math::exact-40.7 {associativity of */} { -setup leakBaseline -body { set v [[exactexpr {2 / 3 * 4}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {8/3 2.6666666666666667e0} } test math::exact-40.8 {associativity of */} { -setup leakBaseline -body { set v [[exactexpr {2 * 3 / 4}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {3/2 1.5000000000000000e0} } test math::exact-40.9 {sum} { -setup leakBaseline -body { set v [[exactexpr {2 + 3}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {5 5.000000000000000e0} } test math::exact-40.10 {difference} { -setup leakBaseline -body { set v [[exactexpr {2 - 3}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {-1 -9.999999999999999e-1} } test math::exact-40.11 {associativity of -} { -setup leakBaseline -body { set v [[exactexpr {2 - 3 - 4}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {-5 -5.000000000000000e0} } test math::exact-40.12 {associativity of +-} { -setup leakBaseline -body { set v [[exactexpr {2 - 3 + 4}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {3 3.0000000000000001e0} } test math::exact-40.13 {associativity of +-} { -setup leakBaseline -body { set v [[exactexpr {2 + 3 - 4}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.0000000000000000e0} } test math::exact-40.14 {precedence of +*} { -setup leakBaseline -body { set v [[exactexpr {3 + 5 * 7}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {38 3.800000000000000e1} } test math::exact-40.15 {precedence of +*} { -setup leakBaseline -body { set v [[exactexpr {3 * 5 + 7}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {22 2.200000000000000e1} } test math::exact-40.16 {parentheses} { -setup leakBaseline -body { set v [[exactexpr {(2 + 3) * 5}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {25 2.500000000000000e1} } test math::exact-40.17 {V + E} { -setup leakBaseline -body { set v [[exactexpr {2 + real(-3/5)}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {1.4000000000000000e0 1.4000000000000000e0} } test math::exact-40.18 {V - E} { -setup leakBaseline -body { set v [[exactexpr {2 - real(3/5)}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {1.4000000000000000e0 1.4000000000000000e0} } test math::exact-40.19 {E / E} { -setup leakBaseline -body { set v [[exactexpr {real(3/5)/real(2/5)}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {1.5000000000000000e0 1.5000000000000000e0} } test math::exact-40.20 {E + V} { -setup leakBaseline -body { set v [[exactexpr {real(3/2) + (2/5)}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {1.9000000000000000e0 1.9000000000000000e0} } test math::exact-40.21 {E - V} { -setup leakBaseline -body { set v [[exactexpr {real(3/2) - (2/5)}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {1.1000000000000000e0 1.1000000000000000e0} } test math::exact-40.22 {E * V} { -setup leakBaseline -body { set v [[exactexpr {real(3/2) * (2/5)}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {6.0000000000000001e-1 6.0000000000000001e-1} } test math::exact-40.23 {E / V} { -setup leakBaseline -body { set v [[exactexpr {real(3/2) / (5/2)}] ref] set result [list [$v asPrint 57] [$v asFloat 57]] $v unref leakCheck set result } -result {6.0000000000000001e-1 6.0000000000000001e-1} } test math::exact-40.24 {lexical error} { -setup leakBaseline -body { set result [list [catch {exactexpr {2 ! 1}} m] $m] leakCheck set result } -match glob -result {1 {invalid character*}} } test math::exact-40.25 {syntax error} { -setup leakBaseline -body { set result [list [catch {exactexpr {2 $ 1}} m] $m] leakCheck set result } -match glob -result {1 {syntax error*}} } test math::exact-41.1 {square root} { -setup leakBaseline -body { set v [[exactexpr {sqrt(25/16)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref #leakCheck set result } -result {1 1.2500000000000000e0} } test math::exact-41.2 {square root} { -setup leakBaseline -body { set v [[exactexpr {sqrt(2)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.4142135623730950e0} } test math::exact-41.3 {square root} { -setup leakBaseline -body { set v [[exactexpr {sqrt(2000000)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.4142135623731e3} } test math::exact-41.4 {square root} { -setup leakBaseline -body { set v [[exactexpr {sqrt(2 / 1000000)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.41421356237309e-3} } test math::exact-41.5 {square root} { -setup leakBaseline -body { set v [[exactexpr {sqrt(sqrt(1/81))}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 3.3333333333333333e-1} } test math::exact-41.6 {square root of negative rational} { -setup { leakBaseline catch {unset v} } -body { set v [[exactexpr {sqrt(-1)}] ref] set result [$v asPrint 57] $v unref unset v set result } -cleanup { if {[info exists v]} {$v unref} } -match glob -returnCodes error -result {*negative argument*} } test math::exact-41.7 {square root of negative real} { -setup { leakBaseline catch {unset v} } -body { set v [[exactexpr {sqrt(-sqrt(81))}] ref] set result [$v asPrint 57] $v unref unset v set result } -cleanup { if {[info exists v]} {$v unref} } -match glob -returnCodes error -result {*negative argument*} } test math::exact-41.8 {square root, cached result} { -setup leakBaseline -body { set x [[exactexpr {sqrt(2)}] ref] set y [[exactexpr {$x * $x}] ref] $x unref set result [list [$y asFloat 57] [$y asFloat 57]] $y unref leakCheck set result } -result {2.0000000000000000e0 2.0000000000000000e0} } test math::exact-42.1 {exponential} { -setup leakBaseline -body { set v [[exactexpr {exp(1)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 2.7182818284590452e0} } test math::exact-42.2 {exponential} { -setup leakBaseline -body { set v [[exactexpr {exp(4)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 5.45981500331442e1} } test math::exact-42.3 {exponential} { -setup leakBaseline -body { set v [[exactexpr {exp(0)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.0000000000000000e0} } test math::exact-43.1 {logarithm} { -setup leakBaseline -body { set v [[exactexpr {log(1)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-43.2 {logarithm} { -setup leakBaseline -body { set v [[exactexpr {log(2)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 6.931471805599453e-1} } test math::exact-43.3 {logarithm} { -setup leakBaseline -body { set v [[exactexpr {log(1/2)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 -6.931471805599454e-1} } test math::exact-43.4 {logarithm} { -setup { # Consume digits from math::exact::log2 to avoid appearance of # a leak in its cache $math::exact::log2 asFloat 100 leakBaseline } -body { set v [[exactexpr {log(4)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.3862943611198906e0} } test math::exact-43.5 {logarithm} { -setup { # Consume digits from math::exact::log2 to avoid appearance of # a leak in its cache $math::exact::log2 asFloat 100 leakBaseline } -body { set v [[exactexpr {log(1/4)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 -1.3862943611198907e0} } test math::exact-43.6 {logarithm} { -setup { # Consume digits from math::exact::log2 to avoid appearance of # a leak in its cache $math::exact::log2 asFloat 100 leakBaseline } -body { set v [[exactexpr {log(exp(10))}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.0000000000000000e1} } test math::exact-43.7 {logarithm} { -setup { # Consume digits from math::exact::log2 to avoid appearance of # a leak in its cache $math::exact::log2 asFloat 100 leakBaseline } -body { set v [[exactexpr {log(exp(1/10))}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.0000000000000000e-1} } test math::exact-43.8 {logarithm of negative argument} { -setup { leakBaseline catch {unset v} } -body { set v [[exactexpr {log(-sqrt(81))}] ref] set result [$v asPrint 57] $v unref unset v set result } -cleanup { if {[info exists v]} {$v unref} } -match glob -returnCodes error -result {*negative argument*} } test math::exact-44.1 {pi} { -setup { # Consume digits from math::exact::pi to avoid appearance of # a leak in its cache $math::exact::pi asFloat 3000 leakBaseline } -body { set v [[exactexpr {pi()}] ref] set result [$v asFloat 3000] $v unref leakCheck list [string range $result 0 4] \ [string first 999999 $result] \ [string range $result end-1 end] } -result {3.141 763 e0} } test math::exact-44.2 {Ramanujan constant} { -setup { # Consume digits from math::exact::pi to avoid appearance of # a leak in its cache $math::exact::pi asFloat 100 leakBaseline } -body { set v [[exactexpr {exp(pi()*sqrt(163))}] ref] set result [$v asFloat 160] $v unref leakCheck set result } -result 2.625374126407687439999999999992e17 } test math::exact-45.1 {tangent} { -setup leakBaseline -body { set v [[exactexpr {tan(0)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-45.2 {tangent} { -setup leakBaseline -body { set v [[exactexpr {tan(pi()/4)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.0000000000000000e0} } test math::exact-45.3 {tangent} { -setup leakBaseline -body { set v [[exactexpr {tan(pi()/-4)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 -1.0000000000000000e0} } test math::exact-45.4 {tangent} { -setup leakBaseline -body { set v [[exactexpr {tan(pi()/3)-sqrt(3)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-45.5 {tangent} { -setup leakBaseline -body { set v [[exactexpr {tan(-pi()/3)+sqrt(3)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-45.6 {tangent} { -setup leakBaseline -body { set v [[exactexpr {1/tan(pi()/2)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-45.7 {tangent} { -setup leakBaseline -body { set v [[exactexpr {tan(pi()/2)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 Undetermined} } test math::exact-46.1 {sine} { -setup leakBaseline -body { set v [[exactexpr {sin(0)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-46.2 {sine} { -setup leakBaseline -body { set v [[exactexpr {sin(pi()/6)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 5.000000000000000e-1} } test math::exact-46.3 {sine} { -setup leakBaseline -body { set v [[exactexpr {sin(-pi()/6)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 -5.000000000000000e-1} } test math::exact-46.4 {sine} { -setup leakBaseline -body { set v [[exactexpr {sin(pi()/2)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.0000000000000000e0} } test math::exact-46.5 {sine} { -setup leakBaseline -body { set v [[exactexpr {sin(-pi()/2)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 -1.0000000000000000e0} } test math::exact-46.6 {sine} { -setup leakBaseline -body { set v [[exactexpr {sin(pi())}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-46.7 {sine} { -setup leakBaseline -body { set v [[exactexpr {sin(-pi())}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-46.8 {sine} { -setup leakBaseline -body { set v [[exactexpr {sin(13*pi()/6)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 5.000000000000000e-1} } test math::exact-46.9 {sine} { -setup leakBaseline -body { set v [[exactexpr {sin(-13*pi()/6)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 -5.000000000000000e-1} } test math::exact-47.1 {cosine} { -setup leakBaseline -body { set v [[exactexpr {cos(0)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 9.999999999999999e-1} } test math::exact-47.2 {cosine} { -setup leakBaseline -body { set v [[exactexpr {cos(pi()/3)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 5.000000000000000e-1} } test math::exact-47.3 {cosine} { -setup leakBaseline -body { set v [[exactexpr {cos(-pi()/3)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 5.000000000000000e-1} } test math::exact-47.4 {cosine} { -setup leakBaseline -body { set v [[exactexpr {cos(pi()/2)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-47.5 {cosine} { -setup leakBaseline -body { set v [[exactexpr {cos(-pi()/2)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-47.6 {cosine} { -setup leakBaseline -body { set v [[exactexpr {cos(pi())}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 -1.0000000000000000e0} } test math::exact-47.7 {cosine} { -setup leakBaseline -body { set v [[exactexpr {cos(-pi())}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 -1.0000000000000000e0} } test math::exact-47.8 {cosine} { -setup leakBaseline -body { set v [[exactexpr {cos(7*pi()/3)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 5.000000000000000e-1} } test math::exact-47.9 {cosine} { -setup leakBaseline -body { set v [[exactexpr {cos(-7*pi()/3)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 5.000000000000000e-1} } test math::exact-45.1 {arctangent} { -setup leakBaseline -body { set v [[exactexpr {atan(0)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-45.2 {arctangent} { -setup leakBaseline -body { # Hack to get $szer as a sign matrix set v [[exactexpr {atan(pi()-pi())}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-45.3 {arctangent} { -setup leakBaseline -body { set v [[exactexpr {4*atan(1)-pi()}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-45.4 {arctangent} { -setup leakBaseline -body { set v [[exactexpr {4*atan(-1)+pi()}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-45.5 {arctangent} { -setup leakBaseline -body { set v [[exactexpr {atan(tan(157/100))}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 1.5700000000000000e0} } test math::exact-45.6 {arctangent, cached} { -setup leakBaseline -body { set u [[exactexpr {atan(1)}] ref] set v [[exactexpr {$u + $u + $u + $u}] ref] $u unref set result [$v asFloat 57] $v unref leakCheck set result } -result 3.1415926535897933e0 } test math::exact-46.1 {arcsine} { -setup leakBaseline -body { set v [[exactexpr {asin(0)}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-46.2 {arcsine} { -setup leakBaseline -body { set v [[exactexpr {asin(1/2)-pi()/6}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-46.3 {arcsine} { -setup leakBaseline -body { set v [[exactexpr {asin(-1/2)+pi()/6}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-47.1 {arccosine} { -setup leakBaseline -body { set v [[exactexpr {acos(0)-pi()/2}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-47.2 {arccosine} { -setup leakBaseline -body { set v [[exactexpr {acos(1/2)-pi()/3}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-47.3 {arccosine} { -setup leakBaseline -body { set v [[exactexpr {acos(-1/2)-2*pi()/3}] ref] set result [list [$v refcount] [$v asFloat 57]] $v unref leakCheck set result } -result {1 0e-18} } test math::exact-48.1 {hyperbolic functions} { -setup leakBaseline -body { set result {} set v [[exactexpr {sinh(0)}] ref] lappend result [$v asFloat 57] $v unref set v [[exactexpr {cosh(0)}] ref] lappend result [$v asFloat 57] $v unref set v [[exactexpr {tanh(0)}] ref] lappend result [$v asFloat 57] $v unref leakCheck set result } -result {0e-18 1.0000000000000000e0 0e-18} } test math::exact-48.2 {hyperbolic functions} { -setup leakBaseline -body { set result {} set v [[exactexpr {sinh(1)}] ref] lappend result [$v asFloat 57] $v unref set v [[exactexpr {cosh(1)}] ref] lappend result [$v asFloat 57] $v unref set v [[exactexpr {tanh(1)}] ref] lappend result [$v asFloat 57] $v unref leakCheck set result } -result {1.1752011936438014e0 1.5430806348152437e0 7.615941559557649e-1} } test math::exact-48.3 {hyperbolic functions} { -setup leakBaseline -body { set result {} set v [[exactexpr {sinh(-1)}] ref] lappend result [$v asFloat 57] $v unref set v [[exactexpr {cosh(-1)}] ref] lappend result [$v asFloat 57] $v unref set v [[exactexpr {tanh(-1)}] ref] lappend result [$v asFloat 57] $v unref leakCheck set result } -result {-1.1752011936438015e0 1.5430806348152437e0 -7.615941559557649e-1} } test math::exact-49.1 {asinh} { -setup leakBaseline -body { set result {} set v [[exactexpr {asinh(-1)}] ref] lappend result [$v asFloat 57] $v unref set v [[exactexpr {asinh(0)}] ref] lappend result [$v asFloat 57] $v unref set v [[exactexpr {asinh(1)}] ref] lappend result [$v asFloat 57] $v unref leakCheck set result } -result {-8.813735870195431e-1 0e-18 8.813735870195430e-1} } test math::exact-50.1 {acosh} { -setup leakBaseline -body { set result {} set v [[exactexpr {acosh(3/2)}] ref] lappend result [$v asFloat 57] $v unref set v [[exactexpr {acosh(2)}] ref] lappend result [$v asFloat 57] $v unref set v [[exactexpr {acosh(3)}] ref] lappend result [$v asFloat 57] $v unref leakCheck set result } -result {9.624236501192069e-1 1.3169578969248167e0 1.7627471740390860e0} } test math::exact-51.1 {atanh} { -setup leakBaseline -body { set result {} set v [[exactexpr {atanh(-1/2)}] ref] lappend result [$v asFloat 57] $v unref set v [[exactexpr {atanh(0)}] ref] lappend result [$v asFloat 57] $v unref set v [[exactexpr {atanh(1/2)}] ref] lappend result [$v asFloat 57] $v unref leakCheck set result } -result {-5.4930614433405485e-1 0e-18 5.4930614433405485e-1} } test math::exact-52.1 {e} { -setup { # don't report cached digits of e as a leak $math::exact::e asPrint 100; leakBaseline } -body { set v [[exactexpr {e()}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 2.7182818284590452e0 } test math::exact-52.2 {e} { -setup { # don't report cached digits of e as a leak $math::exact::e asPrint 100; leakBaseline } -body { set v [[exactexpr {log(e())}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 1.0000000000000000e0 } test math::exact-52.2 {e} { -setup { # don't report cached digits of e as a leak $math::exact::e asPrint 100; leakBaseline } -body { set v [[exactexpr {asinh((e() - 1/e()) / 2)}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 1.0000000000000000e0 } test math::exact-53.1 {real**real} { -setup { # Consume digits from math::exact::e and math::exact::log2 # to avoid appearance of a leak in the cache $math::exact::e asFloat 100 $math::exact::log2 asFloat 100 leakBaseline } -body { set v [[exactexpr {e() ** log(2)}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 2.0000000000000000e0 } test math::exact-53.2 {rational**real} { -setup { # Consume digits from math::exact::e # to avoid appearance of a leak in the cache $math::exact::e asFloat 100 leakBaseline } -body { set v [[exactexpr {2 ** e()}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 6.580885991017921e0 } test math::exact-53.3 {real**1} { -setup leakBaseline -body { set v [[exactexpr {sqrt(4) ** 1}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 2.0000000000000000e0 } test math::exact-53.4 {real**-1} { -setup leakBaseline -body { set v [[exactexpr {sqrt(4) ** (-1)}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 5.000000000000000e-1 } test math::exact-53.5 {real**0} { -setup leakBaseline -body { set v [[exactexpr {sqrt(4) ** 0}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 1 } test math::exact-53.6 {real**+int} { -setup leakBaseline -body { set v [[exactexpr {sqrt(4)**2}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 4.000000000000000e0 } test math::exact-53.7 {real**+int} { -setup leakBaseline -body { set v [[exactexpr {sqrt(4)**5}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 3.200000000000000e1 } test math::exact-53.6 {real**-int} { -setup leakBaseline -body { set v [[exactexpr {sqrt(4)**-2}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 2.5000000000000000e-1 } test math::exact-53.7 {real**+int} { -setup leakBaseline -body { set v [[exactexpr {sqrt(4)**-5}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 3.125000000000000e-2 } test math::exact-53.8 {real**rational} { -setup leakBaseline -body { set v [[exactexpr {sqrt(64)**(10/3)}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 1.02400000000000e3 } test math::exact-53.9 {real**rational} { -setup leakBaseline -body { set v [[exactexpr {sqrt(64)**(1/-3)}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 5.000000000000000e-1 } test math::exact-53.10 {real**integer, accidental} { -setup leakBaseline -body { set v [[math::exact::real**rat [exactexpr {3}] 2 1] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 9 } test math::exact-53.11 {zero to zero power} { -setup leakBaseline -body { set v [[exactexpr {0**0}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -returnCodes error -result "zero to zero power" } test math::exact-53.12 {zero to infinite power} { -setup leakBaseline -body { set v [[exactexpr {0**(1/0)}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -returnCodes error -result "zero to infinite power" } test math::exact-53.13 {zero to rational power} { -setup leakBaseline -body { set v [[exactexpr {0**(1/2)}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 0 } test math::exact-53.14 {infinity to zero power} { -setup leakBaseline -body { set v [[exactexpr {(1/0)**0}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -returnCodes error -result "infinity to zero power" } test math::exact-53.15 {infinity to negative power} { -setup leakBaseline -body { set v [[exactexpr {(1/0)**-1}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 0 } test math::exact-53.15 {infinity to positive power} { -setup leakBaseline -body { set v [[exactexpr {(1/0)**1}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result Inf } test math::exact-53.16 {rational to zero power} { -setup leakBaseline -body { set v [[exactexpr {(2/3)**0}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 1 } test math::exact-53.17 {rational power of negative real argument} { -setup leakBaseline -body { set v [[exactexpr {(-sqrt(64))**(1/3)}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result -2.0000000000000000e0 } test math::exact-53.18 {rational power of argument near zero} { -setup leakBaseline -body { set v [[exactexpr {log(exp(1/8))**(1/3)}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 5.000000000000000e-1 } test math::exact-53.19 {negative real to real power} { -setup leakBaseline -body { set v [[exactexpr {(-sqrt(4))**(1/2)}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -returnCodes error -result "negative number to real power" } test math::exact-53.20 {rational to zero power} { -setup leakBaseline -body { set v [[exactexpr {(2/3)**0}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 1 } test math::exact-53.21 {rational to positive integer power} { -setup leakBaseline -body { set v [[exactexpr {(2/3)**2}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 4/9 } test math::exact-53.22 {rational to negative integer power} { -setup leakBaseline -body { set v [[exactexpr {(2/3)**-2}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result 9/4 } test math::exact-53.23 {rational to rational} { -setup leakBaseline -body { set v [[exactexpr {(-8)**(1/3)}] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result -2.0000000000000000e0 } test math::exact-53.24 {real to 0/0} { -setup leakBaseline -body { set bad [[math::exact::V new {0 0}] ref] set v [[exactexpr {sqrt(2)**$bad}] ref] $bad unref set result [$v asPrint 57] $v unref leakCheck set result } -returnCodes error -result {zero divided by zero} } test math::exact-53.24 {rational to 0/0} { -setup leakBaseline -body { set bad [[math::exact::V new {0 0}] ref] set v [[exactexpr {(1/2)**$bad}] ref] $bad unref set result [$v asPrint 57] $v unref leakCheck set result } -returnCodes error -result {zero divided by zero} } test math::exact-53.26 {unit test - rat**int (2/3)**0} { -setup leakBaseline -body { set v [[math::exact::rat**int 2 3 0] ref] set result [$v asPrint 57] $v unref leakCheck set result } -result {1} } test math::exact-53.27 {rational powers - normalize base and exponent} { -setup leakBaseline -body { set p [[math::exact::V new {-2 -1}] ref] set q [[math::exact::V new {-3 -1}] ref] set r [[exactexpr {$p ** $q}] ref] $p unref $q unref set result [$r asPrint 57] $r unref leakCheck set result } -result 8 } test math::exact-54.1 {abs1, signum1} { -setup leakBaseline -body { set p [[exactexpr {0}] ref] set q [[exactexpr {2}] ref] while 1 { set t [[exactexpr {($q-$p) * 10**36}] ref] set f [math::exact::abs1 $t]; $t unref if {!$f} break set x [[exactexpr {($p+$q)/2}] ref] set resid [[exactexpr {$x*$x-2}] ref] set t [[exactexpr {$resid * 10**36}] ref] if {[math::exact::signum1 $t] > 0} { $q unref; set q $x } else { $p unref; set p $x } $t unref; $resid unref } set result [$p asFloat 100] $p unref $q unref leakCheck set result } -result 1.41421356237309504880168872421e0 } # following are demos that I don't know where to put, yet if 0 { set p 1 for {set i 0} {$i < 20} {incr i} { set f [expr {sin(0.01 * $p* acos(-1))}] set v [[exactexpr "sin($p * pi() / 100)"] ref] set a [$v asPrint 57] set r [expr {$f - $a}] puts "i: $i p: $p float: $f exact: $a difference: $r" $v unref set p [expr {11 * $p}] } } if 0 { for {set x 100} {$x <= 12200} {incr x 100} { set ex [[exactexpr $x] ref] puts "x $x ex [$ex asPrint 57]" set fa [expr {-(double($x)**-4)}] set ea [[exactexpr {-($ex**-4)}] ref] puts "fa $fa ea [$ea asPrint 57]" set fb [expr {exp($fa)}] set eb [[exactexpr {exp($ea)}] ref] puts "fb $fb eb [$eb asPrint 120]" set fc [expr {log($fb)}] set ec [[exactexpr {log($eb)}] ref] puts "fc $fc ec [$ec asPrint 120]" catch {expr {(-$fc) ** -0.25}} ff set ef [[exactexpr {(-$ec)**(-1/4)}] ref] puts [format "kahan's function: %s %g" $ff [$ef asFloat 28]] $ef unref $ec unref $eb unref $ea unref $ex unref } } if 0 { set x0 4.0 set x1 4.25 set ex0 [[exactexpr 4] ref] set ex1 [[exactexpr 4+25/100] ref] for {set i 1} {$i < 100} {incr i} { set x2 [expr {108. - (815. - 1500. / $x0) / $x1}] set x0 $x1 set x1 $x2 set ex2 [[exactexpr {108 - (815 - 1500 / $ex0) / $ex1}] ref] $ex0 unref set ex0 $ex1 set ex1 $ex2 puts "$i $x2 [$ex2 asFloat 57]" } $ex0 unref $ex1 unref } testsuiteCleanup } #----------------------------------------------------------------------------- # End of test cases testsuiteCleanup # Exit if running this test standalone, to allow for Nagelfar coverage if {$::argv0 eq [info script]} { exit } # Local Variables: # mode: tcl # End: