注意:この計算式はRPG、CLPに適しません。下記の変形をご利用下さい。
掲示板で、指摘され、考えてみたら、整数の丸目の際、マイナスが有る場合に関して、はっきりと明確な答えが出ませんでした。-8.9を最も近い整数にまとめると言う場合、-9.0になる場合、-8.0になる場合、と2つ考えられます。実は、式の中にガウス記号[]があったので、気にとめていなかったのですが、RPGには、ガウス記号とか、「床」、「天井」の考え方がありませんでした。
小数以下を持つ数字を、整数にする場合、「床」(floor;xを越えない最大の整数)と「天井」(ceiling;xより小さくない最小の整数)があります。
floor(2.718)=2, floor(-2.718)=-3
ceil(2.718)=3, ceil(-2.718)=-2
RPGで「切り捨てる」場合、2.718=2となり、-2.718=-2になるので、正の整数では、floorで、負の整数では、ceilになります。そもそも切り捨てって、そういう物でしたね。(頭がごちゃごちゃしてきた...)
上記のEXCELシートでは、MOD(n,d) = n - d*INT(n/d)と考えていて、そのINT関数は、
INT(8.9) = 8
INT(-8.9) = -9
となっているので、floorを使っています。つまりMOD(-23,7)は、EXCELと、MVRを使ったRPGでは異なる結果になります。
EXCELでは、MOD(-23,7)は、-23-(7*int(-23/7))=-23-(7*-4)=-23+28=5です。
RPGでは、DIVとMVRで、
-23 DIV 7 CHK1 MVR CHK2
から、CHK1は-3で、CHK2は-2です。つまり、-23-(7*-3)=-23+21=-2になります。切り捨てをベースにしているからですね。
一応、「CHK2 < 0なら、CHK2=CHK2+7」で補正できます(元の数字の符号ではなく、計算結果の方)。これは、マイナスの数値の場合、RPGでは、-4ではなく-3のため-(-7)つまり+7を一回すれば、同値になるからです。また、プラスの数値の場合は、RPGもEXCELも同値になりますので、この補正はしません。
これでは、RPG(多分CLPも)で、簡単に値を求めるのは、無理でした。(2000年いっぱい)負数が出てしまうこの式よりも、この後で紹介する計算式の方がいいと思います。申し訳有りません。この方式での計算は止めてください。
これは、アルゴリズムだけでなく、それをRPGで如何に考えるのかまできちんと、フォローすべきでした。また、指摘していただきありがとうございました。
参考記事:16.35.MOD()とINT()にご用心
またこちらも、参考になります:FORTRAN CS1005: Homework 3 Finding
Weekdays Given The Date負数なら+7でもいいようですね。[2000-3-8]
[2000-3-1] |