を与えます。AS400 CLスクリプト演算は、私はアルゴリズムで割り算の余りを計算しようとしている0
例: 私の問題は、単に0を返すすべての私のCLスクリプトでこのアルゴリズムを使用している
6分の15の残りの部分は確かに3
で15/61. (15/6) = 2
2. (2) * 6 = 12
3. 15 - 12 = 3
の残りの部分を取得します。時間。何故ですか?
でコンパイルpgm
dcl var(÷nd) type(*int) value(15)
dcl var(&divisor) type(*int) value(6)
dcl var(&remainder) type(*int)
dcl var(&msg) type(*char)
/* Calculate remainder. [ed: 29Sep2016] "* &remainder" is now: "* &divisor" */
chgvar var(&remainder) value(÷nd - (÷nd/&divisor) * &divisor)
/* Prior to 29-Sep-2016 redaction, the above was coded as the incorrect expression: +
chgvar var(&remainder) value(÷nd - (÷nd/&divisor) * &remainder) +
and remains, commented-out, to preserve relevance of user-comments about the OP */
/* Cast remainder and display. */
chgvar var(&msg) value(&remainder)
sndpgmmsg msg(&msg)
endpgm
:
crtclpgm pgm(test) srcfile(test) srcmbr(test)
ラン:
call test
出力:
0
OPに示したCLプログラムのソースコードを、この日付24 9月 - 2016年のように、確実に発揮するもののコピー\ペーストではありません説明したような困難。すなわち、最初の 'CHGVAR'の式は、明らかに「計算しようとしています」という表現に一致していません。その結果は、トピックsubjectで記述されているゼロではなく、常に'&dividend'の初期値になります。タイトル。 – CRPence
上記の式の値が整数の型であり、除算の切り捨てが異なる必要があるためです。少なくとも、それはまともなプログラミング言語で起こるはずのことです。 –
「いいえ」は何ですか? 「残余=配当 - (配当/除数)*除数」は、「残余=配当 - (配当/除数)*残余」と同じ表現ではないことを指摘した。 CLソースは後者をコード化した。 整数の除算では、まともなプログラミング言語は、整数除算演算子と、2つの整数オペランドを持つ整数のみの結果を愚かに強制しない別の除算演算子の両方を提供します。 CLは愚かに整数結果を強制しませんが、整数除算演算子を提供することはできませんが、CLは*本物の*プログラミング言語ではない強力な制御言語です。 – CRPence