ここに私の基本的な問題があります:
LOW←6 ⍝ lower bound
UPP←225 ⍝ upper bound
INC←0.01 ⍝ increment
VAL←50 ⍝ value
VAL が増分の倍数であるかどうかを判断したいと考えています。私の最初の解決策は、(VAL-LOW)÷INC が整数かどうかを確認することでした。ここで ⎕CT の問題に遭遇しました (以下は実際のコードではありませんが、私のケースを示しています)。
V←(VAL-LOW)÷INC
W←⌊0.5+|V
V
4400
W
4400
V=W
0
|V-W
1.somethingE¯13
まあ!(注: もちろん、これはコードを「素足」で実行した場合には発生しません。実際の環境でコール スタックの奥深くにある場合のみです。)
2 番目のアイデアはあまりエレガントではありませんでしたが、紙の上では適切に思えました。
V←0 12⍕(VAL-LOW)÷INC
0=⍎(1+V⍳'.')↓V
V を 12 桁に書式設定し、小数点とその左側のすべてを削除します。残りを実行し、それがゼロに等しいかどうかを確認します。それはうまくいきましたが、うまくいかず、12 ナインが残りました。
ああ!
それから、小数点以下 12 桁は必ずしも必要ではないかもしれないことに気づきました。実際、INCにあるのと同じ数だけ必要です。
DEC←(⌽⍕INC)⍳'.'
V←0 DEC⍕(VAL-LOW)÷INC
0=⍎(1+V⍳'.')↓V
わかりません... ますます乱雑になっています。UPP が巨大で INC が 1000 の場合はどうなりますか? これを行うより賢い方法はありますか?
単純な解決策は、LOW、INC、および UPP に基づいて有効な VAL のリストを生成することでしたが、このような解決策では常に作業メモリが不足する危険があります。