2016-05-17 6 views
1

私はDigitalMicrographのtert()コマンドが大好きですが、理解できないことがあります。テストスクリプトを考えてみましょう:実際の数値に対してtertコマンドがどのように機能するか

image test:= realimage("",4,100,1); 
number value1 = 1; 
number value2 = 0.1; 
if(value2==0.1) result("\nvalue2 really equals 0.1"); 
test.setPixel(5,0,value1); 
test.setPixel(10,0,value2); 

image mask = imageclone(test); 
mask = 0; 
mask = tert(test==value1,1,mask); 
mask = tert(test==value2,1,mask); 
mask.showimage() 

スクリプトは、「テスト」のアレイはなく、doesnot value1をvalue2のためにこれを見つけるに等しいピクセルを見つけました。 "value"が整数である場合にのみ、tertコマンドが条件(test == value)を理解しているようです。それ以外の場合は、等価性が完全ではないとみなされます。数値Value2が暗黙的に(私が仮定して)実数として定義されてから実際の配列に割り当てられたので、これは奇妙です。 DigitalMicrographがその値が整数/実数/倍数のどちらであるかを決定する方法は?

+0

構文に関するちょっとしたコメント: 'X = tert(A、B、 C) 'は' X = A? B:C'は読みやすく(また文字列でも動作します)。 – BmyGuest

答えて

1

浮動小数点表現の限定された精度に対して小さいがゼロ以外の許容値を許さずに浮動小数点値を比較するときの典型的な問題は、ここで観察したことです。特定のテストスクリプトでは、DMSのNumber値は常に倍精度であるため、テストイメージの4バイト浮動小数点値とNumberオブジェクトに格納された8バイト浮動小数点値を効果的に比較しているため、問題が発生します。あなたは8バイトの浮動小数点値でテスト画像を割り当てるための最初の行を変更する場合は、次のようにあなたのスクリプトは正しく、両方の値を見つける:

image test:= realimage("",8,100,1); 

一方、より堅牢なソリューションを使用することです浮動小数点値を '等価'と比較したときの小さなゼロでない公差。具体的には、次のようにして、第3の関数を呼び出すスクリプトのテスト行を変更すると、正しく両方の値を見つけることができます。

mask = tert(Abs((test-value1)/value1)<1e-7,1,mask); 
mask = tert(Abs((test-value2)/value2)<1e-7,1,mask); 
関連する問題