05-31-2011 11:26 PM
LabVIEW2010を使用しております。
掲題について、ヘルプ、ディスカッションフォーラムを参照したのですが、"N以上"、”N以下”を示す、”N..”、"..N"の表現しか見つけられませんでした。
ケースストラクチャのセレクタにおいて、"未満"、"~より上" を実現する手段についてご教授頂ければ幸いです。
※N<、N>のように入力したところ、""(ダブルクオート)で囲まれてしまい、エラー「セレクタ値に間違ったタイプがあります」と表示されしまいます。
よろしくお願い致します。
解決済! 解決策の投稿を見る。
06-01-2011 12:35 AM
tshunsuke 様
ケースストラクチャへ数値を接続した場合ですが、
数値が整数(青いワイヤ)の場合は、
例えば"5未満"は、"4以下"と同じ意味になります。同様に"7より上"は、"8以上"と同じです。
ですので、”..4”や、"8.."と書けば良いのです。
数値が浮動小数点(オレンジのワイヤ)の場合は、
残念ながら、ケースストラクチャでは、浮動小数点の値を使用できません。
ワイヤを"?"のケースセレクタ端子に接続した所で整数に”丸め込み”で変換されます。
”丸め込み”は四捨五入に似た働きをします。(厳密にはちょっと違います)
例えば"5未満"としたいのであれば、値をつなぐ前に"切り捨て"で整数にして"..4"にします。
"7より上"の場合は、値をつなぐ前に”切上げ”で整数にして、"8.."にします。
以上、以下、未満、より上が混在する判断は、ケースストラクチャではできません。
[比較]の[範囲内と強制]関数を使うなどして別の方法で判断を行います。
判断結果のBoolの値を利用してケースを切替えてください。
06-01-2011 01:48 AM
KONDOH様
早速の投稿ありがとうございます。
今回使用したい数値は浮動小数点で、かつ、丸めは出来ない条件でしたので、
仰っられるようなBoolを用いた手段にて場合分けを行ないたいと思います。
誠にありがとうございました。
※今のところ、以下のような考えで代替したいと思っています。
if Large > Small:
shori1
else:
if Large == Small:
shori2
else:
shori3
06-01-2011 08:42 AM
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以下」と
することをオススメします。ご参考ください。
06-01-2011 09:01 AM
M.Shiraishi様
大変貴重なご助言を頂きまして誠にありがとうございます。
自分では絶対に気づけないような内容でした。
ご助言頂きました内容を踏まえて、Sign関数の理解からはじめ、再度構成いたします。
浮動小数点が何たるかについても勉強が必要ですね・・・。楽しみたいと思います。
06-07-2011 03:10 AM
まだ浮動小数点についての理解は足りないながらも、
結果としてご指導頂いた内容を踏まえ以下のような流れにしました。
if Large > Small:
shori1
else:
if | Large - Small | <= 1E-15:
shori2
else:
shori3
ご指導ありがとうございました。
06-08-2011 07:27 AM
tshunsuke様
ご連絡ありがとうございます。
1E-15 については、「その値」というより、「許容できる十分小さい値」という意味合いで、
先日の私の記載だと 「差の絶対値が、1E-15以下」とすることを のように
ちょっと確定的に書いてしまいましたが、元の値が大きいと、差をとっても 1E-15 の差が
出ないこともあるので、1E-15 にこだわらず適宜許容値は設定してください。
あるいは、「“AとBの差の絶対値”が、“AとBの絶対値の大きいほう”の1E-XX倍以下」とか
いうふうに相対的に設定するなど、いろいろ工夫してみていただければと思います。
06-08-2011 07:41 AM
M.Shiraishi様
ご丁寧にありがとうございます。
LabVIEWについてはもちろんのこと、プログラミングについてまだまだ未熟ですので、
一言一言が大変勉強になります。
プログラム内容については状況に応じて適切なものにかえて、色々と経験していきたいと思います。
ありがとうございました。