首页 > 解决方案 > 如何计算 Igor Pro 中值列表的小数位数

问题描述

我正在使用 Igor Pro(我不经常使用)。我正在尝试计算一波小数点右侧的位数,如果有的话。然后在第二波中添加一个小数位,无论左边多少位,都在第一波中。作为参考,我附上了一张我目前拥有的照片。波“t​​est_correct”是它应该的样子,而“fix_err”是我当前输出的。我已经有一段时间了,但似乎无法弄清楚,任何帮助将不胜感激。谢谢 例子

Function testErrFix()

    wave test_energy, test_err
    variable i, j, s
    variable len = numpnts(test_energy)
    make/O/D/N=(len) fix_err
    string current_Energy
    string current_Err
    string Error
    variable slen
    For(i=0;i<len;i+=1)
        current_Energy = num2str(test_energy[i])
        current_Err = num2str(test_err[i])
        slen = strlen(current_energy)
        Error = ""
        For(j=0;j<slen;j+=1)
          If(Stringmatch(current_Energy[j], ".")==1)
           For(s=j;s<slen;s+=1)
                 Error += "." + current_Err[s-4] + current_Err[s-3] + current_Err[s-2]
                EndFor
           ElseIf(Stringmatch(current_Energy[j], "")==1)
             Error += current_Err[s+1]
                For(s=j;s<slen;s+=1)
                 Error = current_Err[s]
                EndFor
                EndIf
            EndFor
            fix_err[i] = str2num(Error)
            EndFor  
    
End

标签: igor

解决方案


您的示例错误地使用了 num2str。默认情况下,这只返回 5 位小数,请参阅其文档。您还可以调整表中显示的位数。

你能详细说明你想要达到的目标吗?到目前为止,我从来不需要知道小数点右边的位数。

编辑:小数位数取决于您将数字转换为字符串的方式。所以一般来说这是行不通的。

一个天真的实现

Function/S num2strHighPrec(variable num)

    string str
    sprintf str, "%.15f", num

    return str
End

Function/S RemoveEndingExhaustive(string str, string ending)

    string result

    for(;;)
        result = RemoveEnding(str, ending)

        if(!cmpstr(result, str) || strlen(result) == 0)
            return result
        endif

        str = result
    endfor
End

Function CountDecimalPlaces(variable num)

    string numAsStr
    variable pos

    numAsStr = num2strHighPrec(num)
    numAsStr = RemoveEndingExhaustive(numAsStr, "0")
    pos = strsearch(numAsStr, ".", 0)
    
    if(pos < 0)
        return 0
    endif
    
    return strlen(numAsStr) - 1 - pos
End

可能是一个很好的起点。


推荐阅读