做总和的Tcl错误

时间:2015-07-20 12:42:06

标签: tcl

我想计算存储在tcl列表P中的数字列表的平均值。这是我的脚本:

set sum 0.0
foreach e $P { set sum [expr {$sum + $e}] }
set avg [expr {1.0*$sum / [llength $P]}]

但我有错误:can't use non-numeric string as operand of "+" 我该怎么办?

1 个答案:

答案 0 :(得分:2)

您的问题可能是由于P中的某些元素不是数字。无论如何,这就是你计算平均值的方法:

package require math::statistics
::math::statistics::mean $P

假设P是一个数字列表。

如果你有一个数据项列表,并想知道它们中的任何一个是否不适合expr算术,你可以这样做:

foreach n $data {
    if {![string is double -strict $n]} {
        error "$n is not a number"
    }
}

这将报告第一个非号码。 string is double命令识别整数和浮点数 1 。如果省略-strict标志,空字符串将被视为一个数字(expr仍然会阻塞它,但 2 )。

这将为您提供$data中所有非数字项的子列表:

lmap n $data { 
    if {![string is double -strict $n]} {set n} continue
}

这将为您提供$data中所有正确数字项的子列表:

lmap n $data { 
    if {[string is double -strict $n]} {set n} continue
}

<小时/> 1 名称“double”表示对于任何可以转换为C数据类型double的字符串,它返回true,后者特指存储双精度浮点数number ,(编码浮点数的行业标准)。如果你不知道那是什么,你可以假装它意味着加倍,因为“看起来像整数的数字和看起来像实数的数字”。

2 expr也会阻塞值NaN这是一个完全有效的浮点值,它只代表“不是数字”。

文档:continueerrorexprforeachiflmapmath::statistics包,{{ 3}},packageset