每天一個R語言小技巧(1)——浮點數比較

代碼

root<-function(x){
	a=0
	b=1
	while( a != b ){
		a = b
		b=0.5*(b + x/b)
	}
	b
}

問題

上面這段代碼用於求x的root值。在這裏有一個十分不專業的問題, 那就是a != b的寫法。
對於numeric的變量來說,使用 != 或者是 = = 是非常不專業的。針對整型數,這會返回正確的結果,但是由於機器精度,對於浮點數來說,他就“可能”會返回一個錯誤結果,於是在上述代碼中,該問題則會導致程序陷入While的無限循環。

解決方式

abs(a-b)<exp(-30)

對於向量形式的兩個變量,則可使用 max(abs(a-b))<exp(-30) 來返回兩個向量中的所有元素是否完全一致

PS:對於exp(n)中的n,可以按需選用。例如說,如果兩個浮點數的差距只有10的負十幾次方的話,n可以改爲-40,-50,-60…,省事一點的話,可以直接選到-100之類的,省去麻煩。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章