0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

なんちゃって四捨五入(PLC編)

新人プログラマ応援 - みんなで新人を育てよう!

~条件分岐なしで丸める最小ラダー~

条件分岐なしで丸める最小ラダー
PLC で四捨五入を作るとき、
新人さんはよく 「0.5 以上なら +1」 みたいな
条件分岐ラダーを書きがちです。
でも実は、
四捨五入は “余り×2 ÷ 除数” を商に足すだけ で作れます。
つまり、

- IF文いらん
- 比較命令いらん
- ラダーが一瞬で終わる

なんちゃって四捨五入は桁操作不要

教科書的な四捨五入というと、

小数第1位を丸めたいなら
被除数を×10 して
演算して
+5 して
÷10 する

という 桁操作の手順 が必ず必要になります。

しかし、なんちゃって四捨五入では
丸めたい桁を一切いじらずに四捨五入できます。

これが “なんちゃって” の名前の由来であり、
新人さんにまず伝えたい 最小の丸め方法 です。

最小構成(考え方)

四捨五入の本質はこれだけ
商 = 被除数 ÷ 除数
余り = 被除数 % 除数

(余り × 2) ÷ 除数 → 0 or 1

これを商に足すだけで四捨五入が完成。

ラダー(コピペで動く最小版 キーエンス)

変数の意味
・ DM0:被除数(割られる側)
・ DM2:除数(割る側)
・DM10:商(何を隠そう。答え)
・ TM1:あまり(K社の仕様 1word時)

下記コードを
変種(E) > リスト編集(L) で貼り付け
最下段 [挿入(I)] ボタンでラダー完成!
1行で完結。

LD CR2002
LDA.S DM0
CON
EXT.S
CON
DIV.S DM2
CON
STA.S DM10
CON
LDA.S TM1
CON
MUL.S +2
CON
DIV.S DM2
CON
ADD.S DM10
CON
STA.S DM10

これで 四捨五入 完成。
条件分岐ゼロ。

生成されるラダー
5round4.jpg

例題

● 13567 を 100 で割り四捨五入
商 = 13567 ÷ 100 = 135
余り = 67

余り×2 = 134
134 ÷ 100 = 1

→ 商 + 1 = 136
● 987 を 25 で割り四捨五入
商 = 987 ÷ 25 = 39
余り = 987 - (25×39) = 987 - 975 = 12

余り×2 = 24
24 ÷ 25 = 0

→ 商 + 0 = 39

5Rounding4_01.jpg

普通の四捨五入と同じ結果。

あるある失敗例(YouTubeのPLC講座でもよく見るやつ)

四捨五入の説明で、
「余り ≥ (除数 / 2) なら +1」
というロジックを紹介している動画をよく見かけます。
一見正しそうですが、
除数が奇数のときに壊れます。
理由は、PLC の整数割り算が 小数を切り捨てる からです。

● 失敗例:52 を 7 で割り、四捨五入した場合
除数本来の境界は:
7 / 2 = 3.5

でも PLC の整数演算では:
7 / 2 = 3   ← 小数切り捨て

境界が 3 にズレる ため、こうなります。
52 / 7 
商 = 7
余り = 3

余り[3] ≥ (除数/2 [3]) → 3 ≥ 3 → 成立

→ 商[7]+1 = 8(誤り)

正しい方法(この記事の本題)

(余り × 2) ÷ 除数

これなら 奇数でも偶数でも必ず 0 か 1 が返るので、
境界ズレが起きません。

まとめ

  • 四捨五入は 余り×2 ÷ 除数 で作れる
  • 条件分岐なし
  • ラダー最小
  • 新人でも 5 分で理解できる
    “なんちゃってシリーズ”としては
    最小で最速の丸め処理。

この記事の内容をそのまま試せる
KV-STUDIO ファイル を用意しました。
👉 サンプルZIPはこちら
https://yenqoo.com/qiita/5Rounding4.ZIP
 
▼ 参考:より詳しい丸めの考え方(Spices)
https://yenqoo.com/spices/basic/rounding/rounding.html


この記事が、必要な人へ。
困っている人に、届きますように。


▼ 関連記事(なんちゃってシリーズ)
• なんちゃってタブスイッチ(VT編)
https://qiita.com/yenqoo/items/74c89bbe955e36e5d22a
 
▼ 人気記事
• キーエンスPLCで信号灯を“グラデーション点滅”させる方法
https://qiita.com/yenqoo/items/9a2509b26e415a87a39c


作者
圓空(えんくう)
https://yenqoo.com/spices/
https://yenqoo.com/monologue/

キーエンスPLCを中心に、
“技術 × 美学 × 遊び心” をテーマにした技術文化を発信しています。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?