Top/article/cos-and-std-cos-are-different
English | Japanese
English | Japanese

Menu

  • Top
  • Akihiko Yamaguchi 山口 明彦
  • Project プロジェクト
  • Text テキスト
  • Recent articles 最近の記事
  • Articles 記事一覧 (a to z)
  • Search 検索

Tags タグ †

  • [c++][bash][python][latex][php]
  • [linux][windows][mac][android]
  • [math][algorithm][idea][trick]
  • [liboctave][opencv][git][ros]
  • [setting][bug][general]
↑

Recent articles 最近の記事 †

2019-07-02
  • article/Display-Unix-Time
  • article/Synchronize-Linux-Time-to-Remote
2018-09-27
  • article/python-multimode-singleton
2018-09-02
  • article/rosinstall-git-default-remote
2017-07-28
  • article/SubMenu
2017-03-05
  • article/Import-a-different-version-of-OpenCV-in-Python
2015-08-17
  • article/DRC-finals-2015
2015-01-05
  • article/Upgrade-Android-to-Lollipop
2015-01-01
  • article/Kernel-panic-of-Linux-when-using-Xtion
  • article/Do-not-skip-freeing-data-when-using-tri-mesh-in-ODE
Access: 1/2053 - Admin
These search terms have been highlighted:[c++]

Do you know? cos and std::cos are different

cos と std::cos は別物だっていう話

[c++]
2008-08-26

C++には関数のオーバーロードがあるから,Cの cosf みたいに型ごとに関数を区別して書く必要が無い. cos(x) と書けば, x の型を自動で判別してくれるということだ.が,落し穴が.

using namespace std を書かずに cos(x) を呼び出すと, x の型にかかわらず cos(double) が呼び出されるようだ(g++依存かもしれないが不明).オーバーロードされた cos を呼ぶためには std::cos(x) と書かなければならない.前者でエラーが出ないから, x が long double の場合などには期待した精度が出ないことがある.気づきにくいから注意が必要だ.

サンプルコード:

#include <iostream>
#include <iomanip>
#include <cmath>
#define print(var) std::cout<<std::setiosflags(std::ios::left)\
  <<std::setw(25)<<#var"= "<<(var)<<std::endl

int main(int argc, char**argv)
{
  print(sizeof(float));
  print(sizeof(double));
  print(sizeof(long double));
  print(sizeof(cos(-0.5f)));
  print(sizeof(cos(-0.5)));
  print(sizeof(cos(-0.5l)));
  print(sizeof(std::cos(-0.5f)));
  print(sizeof(std::cos(-0.5)));
  print(sizeof(std::cos(-0.5l)));
  return 0;
}

結果:

 sizeof(float)=           4
 sizeof(double)=          8
 sizeof(long double)=     12
 sizeof(cos(-0.5f))=      8
 sizeof(cos(-0.5))=       8
 sizeof(cos(-0.5l))=      8
 sizeof(std::cos(-0.5f))= 4
 sizeof(std::cos(-0.5))=  8
 sizeof(std::cos(-0.5l))= 12

何もつけない cos が, cos(double) を呼び出していることがわかる. std::cos はちゃんと引数に合わせた型を選んでくれている.




Last-modified:2014-12-30 (Tue) 18:49:56 (3840d)
Site admin: Akihiko Yamaguchi.
Written by: Akihiko Yamaguchi.
System: PukiWiki 1.5.0. PHP 5.2.17. HTML conversion time: 0.008 sec.