abs関数で詰まった話

投稿者: | 2018年11月5日

久しぶりにコンテストに出ました。前回いつ出たんだろ?と思ったら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 >”でいいんだよなあ・・・。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください