본문으로 바로가기

NORMDIST, TRUNC, ROUND 함수 구현

category Tcl & Tk/팁 (Tip) 2025. 3. 26. 16:54

엑셀의 함수인 NORMDIST, TRUNC, ROUND를 Tcl로 구현해보았습니다.

# ------------------------------------------------------------------------------
# NORMDIST : 정규분포함수
# TRUNC : 소수점이하 (특정위치이하) 버리기
# ROUND : 특정위치에서 반올림

# ------------------------------------------------------------------------------
proc ROUND {number {num_digits 0}} {
        if { $num_digits } {
                return [expr {round(pow(10,$num_digits)*$number)/pow(10,$num_digits)}]
        } else {
                return [expr int([expr {round(pow(10,$num_digits)*$number)/pow(10,$num_digits)}]])]
        }
}

# ------------------------------------------------------------------------------
proc TRUNC {number {num_digits 0}} {
        if { $num_digits >= 0 } {
                set number [format "%f" $number]
                set i [string first "." $number]
                set e [expr $i+$num_digits]
                if { $num_digits == 0 } {
                        return [string range $number 0 $i-1]
                } else {
                        return [string range $number 0 $e]
                }
        } else {
                return $number
        }
}

# ------------------------------------------------------------------------------
#https://sites.google.com/site/softwareincidentanalysis/Downhome/statistics-1/ccdfnormaldistribution
proc NORMDIST {x mean std cumulative} {
        if { $cumulative } {
                return [___Phi2 $x $mean $std]
        } else {
                set tmp [expr 1/((sqrt(2*3.141592)*$std))]
                return [expr $tmp * exp(-.5 * pow(($x-$mean)/$std,2))]
        }
}

proc tcl::mathfunc::erf {z} {
        set t [expr 1.0 / (1.0 + 0.5 * abs($z))]
        #use Horner's method
        set ans [expr 1 - $t * exp( -$z*$z - 1.26551223 + $t * ( 1.00002368 + $t * ( 0.37409196 +$t * ( 0.09678418 + $t * (-0.18628806 + $t * ( 0.27886807 + $t * (-1.13520398 + $t * ( 1.48851587 + $t * (-0.82215223 + $t * ( 0.17087277))))))))))]
        if { $z >= 0 } {
                return $ans
        } else {
                return -$ans
        }
}

proc Phi {z} {
        return [expr 0.5 * (1.0 + erf($z / (sqrt(2.0))))]
}

proc Phi2 {z mu sigma} {
        return [Phi [expr ($z - $mu) / $sigma]]
}

'Tcl & Tk > 팁 (Tip)' 카테고리의 다른 글

BLT의 barchart에 원 그리기  (0) 2025.03.26
gets vs read 대용량 파일 테스트  (0) 2025.03.26
반복문 별 소요 시간 테스트  (0) 2025.03.26
그라디언트 구현하기  (0) 2025.03.26
Tcl로 구현한 텔넷 서버  (0) 2025.03.26