title: ループカウンタに浮動小数点数を
author: Amane Katagiri
summary: 気持ちシリーズ
date: 2016-11-15T02:27:00+09:00
category: tech
license: CC BY 4.0
rating: sfw
ai_summary: 浮動小数点数をループカウンタに用いるバッドプラクティスを題材にしたクイズに対し、実務上の価値や教育的観点から批判的に考察する記事です。IEEE 754の精度問題という本質を解説せずに直感との乖離のみを問う姿勢を疑問視し、JPCERTの勧告を引用しながら、実務では避けるべき技巧的コードの危うさを指摘しています。併せてPythonのジェネレータやスコープに関する直感に反する挙動も例示しています。
ai_keywords: 浮動小数点数, ループカウンタ, バッドプラクティス, IEEE 754, プログラミングクイズ, 精度誤差, JPCERT, Python, CodeIQ, 技巧的プログラミング

気持ちシリーズの初回は、「ループカウンタに浮動小数点数マンズの気持ちが知りたい」です。ほんとは[#ugoki](/category/ugoki/)に置きたかった……。

話題にしたいのは、範囲よりも回数に意味を置くループカウンタね。

2016年にもなって、まだこういう問題[^badquiz]やってたんですね。正解は11回。

[^badquiz]: https://twitter.com/codeiq_moffers/status/795762793676881921 （浮動小数点数をループカウンタに使用した際に、ループ回数が直感よりも1回大きくなるという旨の問題が出題されていました）

> 「なぜ11回だと判るのですか？　市民」
["""市民の嗜み"""](http://paranoia.newgamesorder.jp/)

いつも思ってるんだけど、「直感で10回だと思って、しかもそう答えた人はプログラミングやめたほうがいいです。正解は11回でした」ってなんの役にも立たなくない？

1. わざわざ浮動小数点数のループカウンタなんていうバッドプラクティスを持ち出してくるところがクソ。[浮動小数点数型変数をループカウンタとして使用しない](https://www.jpcert.or.jp/java-rules/num09-j.html)で。浮動小数点数を使うという無駄な選択肢を記憶に残したくない。
2. 「は〜なんか小数だと1回多くなるんやな。よっしゃ覚えた！　次は間違わんとこ！」で何も学ばずに終わりそうなところはもっとクソ。この問題についての解説はないらしいし。別に探せばいくらでも出てくるけど、ちょっとそれは違うんじゃないか。

確かに、世の中には[クイズでしか役に立たない知識](http://amzn.asia/eIUmgba "同居している女性たちの月経が同期する")もあるわけだけど、ITエンジニアのための実務スキル評価サービス[^codeiq]が本番で誰も使わないことをクイズでやってどうするの。

> 知りたいのは市場価値ではなく、自分の**スキルがその企業で求められる**か。CodeIQで、企業の第一線のエンジニアによる**実践的な問題**に挑戦！その企業におけるリアルな評価がわかります。気になるあなたは、まずはトライしてみてください！
"""CodeIQ｜ITエンジニアのための実務スキル評価サービス"""[^codeiq]

[^codeiq]: https://codeiq.jp/

実は求められてるスキルで、本当はみんな実務で使ってるのか？

以下、時系列順の人間です。

↓これ僕です

[796508699774763008](/tweet/796508699774763008)

[796508760617336832](/tweet/796508760617336832)

↓こっちはRTしてくれた人です

[796510683487580160](https://twitter.com/nonamea774/status/796510683487580160)

[796511450260914176](https://twitter.com/KHiyowa/status/796511450260914176)

以上、人間でした。

IEEE754についての知識や経験の有無と、これをクソ問題だと思うかどうかは話が別だと思うけど。

10進数を2進数で処理してるところに原因があるんだって示さない限りは、結局学びのないクソ問題のままじゃないのかな。それに、経験したことがあるなら、それこそこんな問題嫌うと思う。

> それ、本気で言ってます？　僕に「IEEE754」の話させたら長くなりますよ？
"""IEEE754ギョーカイに詳しい人"""

こういう問題好きそうな人たち、Pythonで適当なメソッドに複数回ジェネレータ食わせるのとか好きそう。「1回目と2回目で挙動が違う！　これはクイズになるぞ！」とか騒ぐ気がする。いやこれは偏見。

```python
>>> # ルウプの様子
...
>>> f = 0.0
>>> c = 0
>>> while True:
...     f += 0.1
...     c += 1
...     if f >= 1:
...         break
...
>>> f, c
(1.0999999999999999, 11)
```
```python
>>> # ジェネレイタアの様子
...
>>> seq = (x ** 2 for x in range(10))
>>> list(seq)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> list(seq)
[]
```
```python
>>> # スコオプの様子
...
>>> x = 3
>>> for x in range(10):
...     pass
...
>>> x + 1
10
```
```python
>>> #スコオプの様子その2
...
>>> g = 2
>>> def func():
...     g *= g + 1
...
>>> func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in func
UnboundLocalError: local variable 'g' referenced before assignment
```

こういうことはするな。上手いことやろうね。

直感では分からない技巧プログラミング、中学生が好きそう。魔法みたいだから。みんなも魔法好きですよね。僕も実務で使わない限りでは好きです。
