From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

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

解決済み
解決策を見る

LabVIEW2010を使用しております。

 

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

 

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

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

 

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

 

 

0 件の賞賛
メッセージ1/8
7,004件の閲覧回数
解決策
トピック作成者tshunsukeが受理

tshunsuke 様

 

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

 

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

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

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

 

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

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

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

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

 

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

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

 

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

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

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

メッセージ2/8
7,001件の閲覧回数

KONDOH様

 

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

 

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

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

 

 

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

 

 

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

 

if Large > Small:

shori1

else:

if Large == Small:

shori2

else:

shori3

0 件の賞賛
メッセージ3/8
6,996件の閲覧回数

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以下」と

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

すべてをダウンロード
メッセージ4/8
6,981件の閲覧回数

M.Shiraishi様

 

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

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

 

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

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

 

0 件の賞賛
メッセージ5/8
6,972件の閲覧回数

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

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

 

 

if Large > Small:

 shori1

else:

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

  shori2

 else:

  shori3

 

 

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

0 件の賞賛
メッセージ6/8
6,878件の閲覧回数

tshunsuke様

 

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

 

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

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

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

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

 

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

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

 

0 件の賞賛
メッセージ7/8
6,838件の閲覧回数

M.Shiraishi様

 

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

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

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

 

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

 

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

 

 

0 件の賞賛
メッセージ8/8
6,835件の閲覧回数