久しぶりにコンテストに出ました。前回いつ出たんだろ?と思ったら5月で、まじかよおいってなってます。3年間で10回すらコンテストでてないというね。流石にやばいんで、年度内に緑にはなっておきたい・・・。
それはさておき、ABS関数の話です。ABC113のB問題でabs関数を使いました。それで、次のようなコードを書きました。
それで自分の環境でコンパイルしたわけですが、ちゃんとコンパイルでき、答えもサンプルとおなじになりました。そして、提出をすると、結果がCE(Compile Error)。なんでや!!と思って調べたら、次のような文章が見つかりました。
これまでのところ:math.hはCであり、10年以上前に作成されました。 math.hでは、その基本的性質のために、abs()関数は整数型の “本質的”なので、double型の絶対値を取得したい場合は、fabs()を使用しなければなりません。 C++を作成したときにはmath.hとなり、cmathとなりました。 cmathは本質的にmath.hですが、C++では改善されています。 abs()とabsを区別する必要があるなどの改善が加えられ、double型とinteger型の両方に対してabs()が作成されました。f要約すると 次のいずれか 使用のmath.hとダブルス または 使用cmathための整数のabs()、fabs()を使用し、ちょうどすべて(簡単かつ推奨)
あいまいなオーバーロードの呼び出し(doble)
math.hでabs関数を用いると、引数にint型を用いなければならず、double型を用いるときにはfabs()を用いなければならない。しかし、cmathの場合はabs()でint型以外の方も引数として取れる、らしいです。知らんかった。
コード書いてるとき、「abs関数って因数double型いけたっけ?」と思ってcpprefjp – C++日本語リファレンスで調べたんですが、よく見たら”cmath/abs”ってなってました。
ということで、C++書くときはcmath使おうと思いました。
そもそも競プロなら、”#include<bits/stdc++.h >”でいいんだよなあ・・・。