知識が足りない

またもバグに悩まされ,Release モードでのみ動きがおかしくなるのみならず,print 文を (しかも当該処理よりあとに) 入れると直るんです先生,と職員室に駆け込む経験を経て今日の私が得た結論は 「コンピュータの知識が圧倒的に足りない」 ということであった.少なくとも,周りの人間に対して大変不足している.
確かに昔の人には,PC など見たこともなくこの 20 年やってきました,というような人種が存在する一方で,詳しい人はそりゃもうコンピュータの進化とともに進化してきた圧倒的能力を誇るのであって,数年のぽっと出ではどうしようもない.だが別に同僚は昔の人ばかりではないのであまり言い訳にはならない.
なにか一部でも詳しければ利用できるのだろうが,たとえばハードウェアについてはごくあいまいな概念しか知らない.ソフトウェアについても然り.専門はもっと抽象化されたアルゴリズム分野だからだ.だからといってチューリングマシンが (アルゴリズム的な意味で) 書けるわけでもないし,そもそも書けてもそれはもう仕事上必要なコンピュータ知識とかけ離れている.
しかし現に 「コンピュータ全般の知識」 とは広すぎてどうしていいやらであるし,またいまさら 「1 年間コンピュータ修行の旅に出ます」 というわけにもいかないしそもそもあまり好きでもないのでやりたくない.やはり仕事上必要な都度身につけてゆくしかあるまい.
ということで,今回の冒頭の現象の答だが,「if(a <= 0 || is_nan(a)) では検査したことにならない」 である.a が NaN だったとしても,左側の比較で壊れてしまい右が false になったりするのですな.IEEE 754 には沿ってない気がするが,少なくとも VC では条件によってはそういう動作をする.規格に従ってくれよ MS, と思うがそれも現状ここで言っても詮無いこと.ドキュメントも規格も信用ならんとして動作確認するしかなかったりする.