• ベストアンサー

c++ cmathとmath.h

お世話になります。c++を始めたばかりの者です。 cmathとmath.hの二つのヘッダーファイルは、それぞれ何をするときに使用するのでしょうか。 教本やネットを調べてもイマイチ理解できず、質問させていただきました。 ご回答よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

どちらも数値演算をする際に使用するヘッダファイルです。 どちらを使用すべきかは、C言語では<math.h>の一択です。 C++ではどちらも使えます。というか、<cmath>は<math.h>をラップしていて結局同じ関数が呼ばれます。 では何が違うかというと、<cmath>をインクルードした時の数値演算関数はstd名前空間内に所属するようになります。それに対して、<math.h>をインクルードした時の数値演算関数はグローバル関数になります。

akebono003
質問者

お礼

ご連絡遅れ失礼しました。 ご回答ありがとうございました。 どちらでも使える、ということで安心しました。 参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

math.hは昔のコードとの互換性のために使えるようになっているだけで、新規作成するC++のコードでは使ってはいけません。cmathをincludeして、std::log2(2);のように書きましょう。 C++11の下書き (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf ) で見た感じですが、このAnnex D compatibility features、D.5 C standard library headersにそのことが載っています。なお、Annex Dに書いてあることはすべて互換性のために使えるようになっている非推奨の機能です。新しいC++のコードではmath.dでなくcmathなどを使うようにしましょう。 cmathそのものはsin、cos、log、exp、sqrtなど数学的な計算が必要なときに使います。何の関数が使えるかはこれを見ると良いでしょう。 http://www.cplusplus.com/reference/cmath/

akebono003
質問者

お礼

ご連絡遅れ失礼しました。 ご回答ありがとうございました。 URLまでつけていただき、大変助かります。 参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C++でのmath.hやstdio.hの使用につい

    C++言語でソースコードをかくとき、ヘッダファイルでmath.hやstdio.hを使用するのはよくないのでしょうか cmathやcstdioを使用しなければならないのでしょうか あるいはmath.hやstdio.hよりも、cmathやcstdioの使用が推奨されているのでしょうか

  • <math.h>があるのにsqrtが・・・

    最初にあるプログラムを作っていたのですが、その祭sqrtでエラーが出てしまったので、別にsqrtを使う短いプログラムを作りました。それが以下のものになります。(test3.c) 「 #include<stdio.h> #include<math.h> int main(void){ int atai; double x=2.0; atai=(int)sqrt(x); printf("atai is %c",atai); } 」 sqrtが動作するか確かめる為のものです。このプログラム(test3.c)で以下のエラーが出てしまいました。 「 /tmp/ccqEejZ1.o(.text+0x4d): In function `main': test3.c: undefined reference to `sqrt' collect2: ld はステータス 1 で終了しました 」 ちなみにLinux(Fedora core 4)を使用しています。 初心者ということもありなぜエラーが出るのか分かりません。 ちなみに<math.h>を使用しないプログラムは普通に動作します。 解決方法をご存知の方がいらっしゃいましたらご教授下さいませ。 よろしくお願いします。

  • C言語でのアークタンジェント

    Visual Studio C+でヘッダーファイルmath.hを用いて、atan2(,)を使用したいのですが、返り値の設定が-pi~piになっていて困っています。 この返り値の設定を変更したいのですが、どのファイルを変更すればいいのか、どのように変更すればいいのかがわかりません。 誰かわかる人がいたらアドバイスをお願いします。

  • Makefile と <math.h>

    C言語初心者です,Vine Linuxを使用しています. Makefileを用いたコンパイルをしたいのですが,あるcコード中にある,「sqrt」でコンパイラからエラー警告が出ます. エラーコード: gcc -o p001 pMain001.o pIo001.o pFnc001.o pFnc001.o(.text+0x214): In function 'sqr_Rt': : undefined reference to 'sqrt' collect2: ld はステータス 1 で終了しました make: *** [p001] エラー 1 Makefile: #Makefile for p001 CC = gcc p001: pMain001.o pIo001.o pFnc001.c $(CC) -o p001 pMain001.o pIo001.o pFnc001.o pMain001.o: pMain001.c pIo001.c p001.h $(CC) -c pMain001.c pIo001.c pIo001.o: pIo001.c p001.h $(CC) -lm pIo001.o pIo001.c pFnc001.o: pFnc001.c p001.h $(CC) -c p001.o pFnc001.c プログラムの概要: p001.hには,構造体定義と関数プロトタイプ宣言. pIo001.cには,キーからの入力と,出力の関数. pFnc001.cにはp001.hにある定義を用いた関数があり,この中にsqrtを使う関数がある. pMain001.cではpIo001.cとpFnc001.cにある関数を利用し,入出力を行う. Makefileの記述が間違っているような気がしてならないんですが,何せ勉強不足なものでよくわかりません. <math.h>はp001.hでインクルードしていますが,これは違いますか? 長文を読んで下さってありがとうございます,「ココおかしい」などの指摘お待ちしています;;

  • C言語のヘッダファイル

    前回のC言語のコンパイラの質問で、たくさんのご回答ありがとうございました。 おかげさまでコンパイラはなんとかなりそうですが、ひょっとしたらまた同じ質問を載せるかもしれません(^^; 今回はC言語のヘッダファイルを自分で作ってみたいんですが、よくわかりません。 microsoft visual studioのvisual c++付属のINCLUDEフォルダにある、stdio.hを開いてみたのですが、基本のprintf()やscanf()なども、どう定義されているか わからず終いでした。本などでもいまいち詳しく書いていなく(そう思うのは僕だけ?)、困っています。c言語のヘッダファイルとc++のヘッダファイルは やっぱり別ものなんでしょうか?ご回答おまちしております。

  • C言語 正規表現 regex.h 利用できない

    c言語を用いてCSVファイルの中に書かれている数字を集計するプログラムを作っています。 そこで正規表現(ワイルドカード)を使いたいと思いました。 調べた結果、regex.hのヘッダファイルを読み込むことで、正規表現を使用できる関数があることがわかりました。 しかし、regex.hをダウンロードしたのですがコンパイルエラーが起きてしまいます。 うまくregex.hをダウンロードできていないか、もしくはヘッダファイルを入れる場所がおかしいかだと思います。 もし使われている方がいましたらご教授お願いします。 私が使っているパソコンはwindowsXPです。

  • C#について

    お世話になります。 今までUNIX-Cをやってましたが今度仕事でC#を使用することになりました。そこでC#の勉強に役立つ書籍やサイトがあれば教えてください。  初歩的な質問ですが、c#では、#defineでの数値などの定義が出来ないようですがそれらのマクロ定義はどうするのでしょうか。  また、ヘッダーファイルに相当するものなどはあるのでしょうか。

  • C++での <iostream.h>と<iostream>とusingnamespaceの関係等を教えてください。

    どうでもいい質問なのですが… C++で色々とソースを打っていると気づいたのです。 #include <iostream.h>とするとusing namespace std;の一文を書かなくてもコンパイルエラーになりません。 また、逆に#include <iostream>とするとusing namespace std;の一文が必要になります。 だから、h(ヘッダファイル)の.hは必要なのかな?と思い、#include <cstdlib.h>とするとコンパイルエラーになります。 なにか理屈がわかりません。コンパイラはVC++6.0です。よろしくご回答の方お願いいたします。

  • C++の名前空間について

    C++学習者です。 Visual Studio 2015 を使ってアブストラクトクラスを作ろうとしています。 教本どうりにコードを入力したのですが、間違いを表す赤い波線が出てきました。 添付してある写真のように、名前空間std にはstring が定義されていないようです。 ヘッダーファイル<string.h> をstd の一部として認識させるにはどうすればよいのでしょうか? 詳しい方、どうか教えてください。お願いします。

  • ヘッダーの記述方法<XX.h>と"XX.h"の違い

     タイトルのままですが、質問はヘッダーの書き方についてです。    読み込むヘッダーの記述方法は、<>と""の2通りであることは知っていますが、その違いがよく分かりません。  今まで見た参考書だと「<>は標準関数で、""は自作関数の場合に使う」と書かれているのですが、私の環境(VC++)だとstdio.hを""で括っても何の問題も無く、実行ファイルが出来ます。  そうなっているからなのかもしれませんが、どうもよく理解できませんので、回答お願いいたします。

このQ&Aのポイント
  • Ideapad Flex5 14ALC05のUSB-Cポートから外付けディスプレイに映像出力したいが、映像が映らない問題について解決方法を教えてください。
  • ディスプレイはサンワサプライ製DP-01でDPオルタネイトモードに対応しており、接続したUSBC to Cケーブルも映像伝送に対応しています。
  • 設定やアダプターのインストールなど、必要な対策があれば教えてください。
回答を見る