如何在Igor Pro中计算值列表的小数点后几位



我正在使用Igor Pro(我不经常使用(。我试着计算一个波的小数点右边的位数,如果有小数点的话。然后加一个小数位无论左边有多少地方,都是第一波,第二波。为了参考,我附上了一张我目前拥有的照片。波浪";test_ 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

您的示例错误地使用了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

这可能是一个很好的起点。

最新更新