NI製品ディスカッション

cancel
Showing results for 
Search instead for 
Did you mean: 

ケースストラクチャのセレクタで、"未満"、"~より上" を実現する手段について

Solved!
Go to solution

LabVIEW2010を使用しております。

 

掲題について、ヘルプ、ディスカッションフォーラムを参照したのですが、"N以上"、”N以下”を示す、”N..”、"..N"の表現しか見つけられませんでした。

 

ケースストラクチャのセレクタにおいて、"未満"、"~より上" を実現する手段についてご教授頂ければ幸いです。

※N<、N>のように入力したところ、""(ダブルクオート)で囲まれてしまい、エラー「セレクタ値に間違ったタイプがあります」と表示されしまいます。

 

よろしくお願い致します。

 

 

0 Kudos
Message 1 of 8
(5,102 Views)
Solution
Accepted by topic author tshunsuke

tshunsuke 様

 

ケースストラクチャへ数値を接続した場合ですが、

 

数値が整数(青いワイヤ)の場合は、

例えば"5未満"は、"4以下"と同じ意味になります。同様に"7より上"は、"8以上"と同じです。

ですので、”..4”や、"8.."と書けば良いのです。

 

数値が浮動小数点(オレンジのワイヤ)の場合は、

残念ながら、ケースストラクチャでは、浮動小数点の値を使用できません。

ワイヤを"?"のケースセレクタ端子に接続した所で整数に”丸め込み”で変換されます。

”丸め込み”は四捨五入に似た働きをします。(厳密にはちょっと違います)

 

例えば"5未満"としたいのであれば、値をつなぐ前に"切り捨て"で整数にして"..4"にします。

"7より上"の場合は、値をつなぐ前に”切上げ”で整数にして、"8.."にします。

 

以上、以下、未満、より上が混在する判断は、ケースストラクチャではできません。

[比較]の[範囲内と強制]関数を使うなどして別の方法で判断を行います。

判断結果のBoolの値を利用してケースを切替えてください。

Message 2 of 8
(5,099 Views)

KONDOH様

 

早速の投稿ありがとうございます。

 

今回使用したい数値は浮動小数点で、かつ、丸めは出来ない条件でしたので、

仰っられるようなBoolを用いた手段にて場合分けを行ないたいと思います。

 

 

誠にありがとうございました。

 

 

※今のところ、以下のような考えで代替したいと思っています。

 

if Large > Small:

shori1

else:

if Large == Small:

shori2

else:

shori3

0 Kudos
Message 3 of 8
(5,094 Views)

tshunsuke様

 

横槍で恐縮です。

 

>> if Large > Small:

>> shori1

>> else:

>> if Large == Small:

>> shori2

>> else:

>> shori3

 

こういった処理(未満、等しい、超)であれば、添付の 110601-sample1.png のような方法もあります。

sign関数を使うと、引き算の結果が正・ゼロ・負で分類でき、caseが1つで済みます。

また、入力がNaNだったり、Inf 同士を比較しようとしたりした場合は、答えもNaNになるので、

エラーも分類できます。

 


 

ただ、1点、「浮動小数点のイコール判定」は、あまりおすすめしません。

(引き算してsign関数に通す場合の「0」出力も同様)

 

上記の例だと、「shori2」は、下手すると、本来実行されるはずなのに実行されない、と悩まされる

場合があります。

 

添付の 110601-sample2.png のように、人間が見ると「全部イコールのはず」のものでも

コンピュータは「違う」と判断することがあります。

0.4×0.9=0.6×0.6=0.36 のはずですが、コンピュータでは最初のイコールは「False」です。

 

10進数でキリが良くても、2進数の浮動小数点では循環小数になっており、1ビットでも違えば

イコールは成立しないためです。

 

そのため、浮動小数点のイコール判定は、必ず許容差を設けて「差の絶対値が、1E-15以下」と

することをオススメします。ご参考ください。

Download All
Message 4 of 8
(5,079 Views)

M.Shiraishi様

 

大変貴重なご助言を頂きまして誠にありがとうございます。

自分では絶対に気づけないような内容でした。

 

ご助言頂きました内容を踏まえて、Sign関数の理解からはじめ、再度構成いたします。

浮動小数点が何たるかについても勉強が必要ですね・・・。楽しみたいと思います。

 

0 Kudos
Message 5 of 8
(5,070 Views)

まだ浮動小数点についての理解は足りないながらも、

結果としてご指導頂いた内容を踏まえ以下のような流れにしました。

 

 

if Large > Small:

 shori1

else:

 if | Large - Small | <= 1E-15:

  shori2

 else:

  shori3

 

 

ご指導ありがとうございました。

0 Kudos
Message 6 of 8
(4,976 Views)

tshunsuke様

 

ご連絡ありがとうございます。

 

1E-15 については、「その値」というより、「許容できる十分小さい値」という意味合いで、

先日の私の記載だと 「差の絶対値が、1E-15以下」とすることを のように

ちょっと確定的に書いてしまいましたが、元の値が大きいと、差をとっても 1E-15 の差が

出ないこともあるので、1E-15 にこだわらず適宜許容値は設定してください。

 

あるいは、「“AとBの差の絶対値”が、“AとBの絶対値の大きいほう”の1E-XX倍以下」とか

いうふうに相対的に設定するなど、いろいろ工夫してみていただければと思います。

 

0 Kudos
Message 7 of 8
(4,936 Views)

M.Shiraishi様

 

ご丁寧にありがとうございます。

LabVIEWについてはもちろんのこと、プログラミングについてまだまだ未熟ですので、

一言一言が大変勉強になります。

 

プログラム内容については状況に応じて適切なものにかえて、色々と経験していきたいと思います。

 

ありがとうございました。

 

 

0 Kudos
Message 8 of 8
(4,933 Views)