忍者ブログ
物理学者(ポスドク)による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

今後C++を使う機会が多そうなので、早めに習得をしていく
とりあえずC言語との違うところをまず抑えて、次によく使うライブラリーを使ってみようと思う。






C++で画面出力するときは次のようにする
int a = 5;
cout << "a = " << a << "\n"
これで次のように表示されるはず
a = 5
これがもし科学の計算ならいろいろと注文したいことがある
1, 桁数をもっと多く表示してほしい(例えば15桁全部)
2, 12345e+5とか1.2345とか表示形式を指定したい
(3, 桁数を揃えたい)




とりあえず1と2について
double e = 1e-15;
cout << fixed << setprecision(16) << 1e-15 << "\n";
cout << scientific << setprecision(16) << 1e-15 << "\n";
これで、
0.0000000000000010
1.0000000000000001e-15
こんな感じに表示されるはず


ここでfixとかscientficは操作子と呼ばれるらしいです
他にもあるので、今後使う可能性があるものを簡単にまとめておきます

■基数
dec 整数の入出力を10進法で行う
hex 整数の入出力を16進法で行う
oct 整数の入出力を8進法で行う
setbase(n) 整数の入出力をn進法で行う


■ 浮動小数点
fixed 浮動小数点の数を23.45という風に表示する
scientific 浮動小数点の数を23.45e+6という風に表示する
setprecision(n) n桁の精度で表示する
showpoint 小数点を付けて表示する
noshowpoint 小数点を付けずに表示する
ただし setw, setprecision, setw他を使う場合は #include とプログラムの上の方に書いておく必要がある









PR
現在新しい言語を模索中
Haskellを触ってみたが、いろいろと挫折

とりあえず昔買ったけどずっと放置していたc++の本を読んで、
ソースをそのまま書き写してみたりして勉強中

いろいろと便利すぎてやべぇw


今回は変数の上限値を表示させてみる
よくある例のヤツ

char   -128~127
signed char   -128~127
unsighed char   0~255

int   -2147483648~2147483647
unsigned int   0~4294967295

long   -9223372036854775808~9223372036854775807
unsighed long   0~18446744073709551615

double   2.22507e-308~1.79769e+308
unsigned double    0~1.79769e+308



include すべきヘッダーはclimitsとcfloat
climitsにはint型、cfloatにはfloat型の変数の上限値が書かれている

■ 参考リンク
(limits.h)、  (float.h)

最近、gnuplotでアニメを作って遊んでいる
探したら、ネットにいろいろなアニメを作るソースが落ちている

例えばものを投げたときの放物線のアニメとか
最初に解析式を求めるわけじゃなくて、微分方程式をその点について解いて点をどんどんうっていくような感じ

その中で「ソフトウェアタイマ」と呼ばれるものが使われていた

つまり
int i, k;
for(i=0; i<1e+6; i++) k++;
みたいなの
単純な演算を繰り返して、時間を無駄に使う。要するにここで足踏み

これは実行するマシンによって、時間が変わるしよろしくないらしい

そこで
unsigned int usec;
usleep( usec );
もしくは
unsigned int sec;
sleep( sec );
ってのを使うらしい

usecはミリ秒、secは秒だけ足踏み可能。

ブックマークを整理してたら見つけた

■リンク
計算物理のためのC/C++言語入門



ソートは色々と種類があって、それぞれ並べ替える方式の違いから実行ステップ数が変わってくる
その結果、かかる時間がデータの種類によってマチマチ
本当はそこんところをしっかり考えないといけない・・・・が、

なんでもいいからソートしたいという時もあるものです


そういうときは、

#include <gsl/gsl_sort.h>
#include <gsl/gsl_sort_vector.h>
をインクルードして、

gsl_sort(hoge, 1, 5);
とすればおーけー

hogeは配列の名前
1hoge[i]のiをいくつずつずらしていくか
5は配列の大きさ

とりあえずこれでソートはしてくれるようです
タイトルのわかりにくさ・・・・



要するに、2桁の数字を出力するときに、3桁で余ってるところを0埋めしたいと
i=10;
printf("%03d¥n", i);

で出力したら、
010
的な。


%03dの0がポイントです


■参考サイト
リーディングゼロの指定

危うく逆にするところだったのでメモ

atan2(y, x)で
949b4810■参考
atan2






(2017/4/8 追記)

atan2の返り値は [-pi, pi]
acosの返り値は[0, pi]
asinの返り値は[-pi/2, pi/2]





(2017/11/22 追記)

値域の数学記号が間違っていたので修正をした













とみながだいすけさんが日本語訳してくれているこちらのドキュメント によると、

17章に積分ルーチンが載っています。
(執筆時はversion 1.15が最新バー)

今までは、台形積分やらシンプソン則の積分しかC言語では書いて使ったことがなかったので
どうやって使うのかもさっぱり・・・・

とりあえずサンプルコードが一つあったので、そのまま書いて実行してみます。



が、エラー
gcc -c sample_integral.c
sample_integral.c: In function ‘main’:
sample_integral.c:37: warning: format ‘%ld’ expects type ‘long int’, but argument 2 has type ‘int’
gcc -o sample_integral sample_integral.o -lgsl -gslcblas
コンパイルは通って、実行ファイルも出来てますが・・・・

原因は構造体wのメンバsizeを呼び出して出力するときの型の問題。
sizeはsize_t型ですが、
同期曰く、size_t型は一般にはintと同じ型だけど、ここではlong int型として扱ってしまっているらしく

printf("%d¥n", w->size);

printf("%ld¥n", w->size);

と変更すればエラーは消えました。



しばらくはこれを使ってみようかと・・・
できれば中でどういうことをしているのかを知りたいですね。
double xx,yy,zz;
xx = 10.0/11.0;
yy = 10.0/11;
zz = 10/11;
printf("%lf %lf %lf\n", xx, yy, zz);



計算結果は
0.909091 0.909091 0.000000


doubleがどっかに入ってたら、結果もdoubleになるらしい

けど、怖いので、
yy = 10.0/(double)11;
とかにしたいですね
FFTWの公式サイトから落としてきたファイルを解凍して、中に入る

いつものcd fftw-3.3.1/
./configure
make


これでbenchが使えるようになる。



使い方と実行結果$bench 16                  #16はファイルサイズ
Problem: 16, setup: 18.00 us, time: 81.74 ns, ``mflops'': 3914.8


あとはファイルのサイズを変えてbenchに食わせるようなシェルスクリプトをちょいちょいと書いて実行。

Mac mini とMac Book airではこんな感じの結果になりました。

日本語化されたpdfを参考にしてみた。
GSL リファレンス・マニュアル日本語訳

#include <gsl/gsl_interp.h>
#include <gsl/gsl_spline.h>

gsl_interp_accel *acc = gsl_interp_accel_alloc();
const gsl_interp_type *T = gsl_interp_cspline;
gsl_spline *spline = gsl_spline_alloc(T, data_size);

gsl_spline_init(spline, f0, fn, data_size);

i=0;
for(xi = inif[0]; xi < inif[data_size-1]; xi += DELTA){
i++;
yi = gsl_spline_eval(spline, xi, acc);
printf("%.15le %.15le\n", xi, yi);
}


gsl_spline_free(spline);
gsl_interp_accel_free(acc);




補完の方法は他にも選べる。
gsl_interp_linear, gsl_interp_csplineとか
自分の欲しい結果に合ったものを用いるべし

gsl_spline_init(spline, f0, fn, data_size)
下端f0から上端fnまでdata_size個のデータから補完する
補完元データを読み込ませる

yi = gsl_spline_eval(spline, xi, acc);
これでxiのときの補完した値が得られる

gsl_spline_free(spline);
gsl_interp_accel_free(acc);
全部終わったら解放しておくこと



今自分で書いたコードを読み返してみて色々とまずい気がするなー・・・ボソッ
i=0;
for(xi = inif[0]; xi < inif[data_size-1]; xi += DELTA){
i++;
この辺とか
#include < stdio.h >
#include < string.h >

char fname[128];
char *p;

strcpy(fname, "abcde.dat");
p = strrchr(fname, '.');
if(p!=NULL){
*p=0x00;
}
printf("%s\n",fname);


これを実行したら
abcde
となるはず

参考ページ
http://winofsql.jp/VA003334/Cprog050930083833.htm
limits.h にCで使われる様々なデータ型の上限・下限が載っている

○使い方
#include
#include

int main(void){

printf("char のサイズ: %d bit\n", CHAR_BIT);
printf("char の最大値: %u\n", CHAR_MAX);
printf("char の最小値: %d\n", CHAR_MIN);
printf("int の最大値: %d\n", INT_MAX);
printf("int の最小値: %d\n", INT_MIN);
printf("long の最大値: %ld\n", LONG_MAX);
printf("long の最小値: %ld\n", LONG_MIN);
printf("signed char の最大値: %d\n", SCHAR_MAX);
printf("shigned char の最小値: %d\n", SCHAR_MIN);
printf("short の最大値: %d\n", SHRT_MAX);
printf("short の最小値: %d\n", SHRT_MIN);
printf("unsigned char の最大値: %u\n", UCHAR_MAX);
printf("unsigned int の最大値: %u\n", UINT_MAX);
printf("unsigned long の最大値: %lu\n", ULONG_MAX);
printf("unsigned short の最大値: %u\n", USHRT_MAX);

return 0;
}



これでチェック可能。
ちなみに自分のMac OS X 10.7.2での実行結果は

char のサイズ: 8 bit
char の最大値: 127
char の最小値: -128
int の最大値: 2147483647
int の最小値: -2147483648
long の最大値: 9223372036854775807
long の最小値: -9223372036854775808
signed char の最大値: 127
shigned char の最小値: -128
short の最大値: 32767
short の最小値: -32768
unsigned char の最大値: 255
unsigned int の最大値: 4294967295
unsigned long の最大値: 18446744073709551615
unsigned short の最大値: 65535


参考ページ
http://www1.cts.ne.jp/~clab/hsample/IO/IO19.html

gcc -c gsl_example.c -lm -lgsl -lgslcblas

デフォルトの場所にGSLがインストールされているなら、-Lや-Iオプションは不要で、これでおk
Numerical Recipes in Cというものがある。



C言語を学ぶなら読んどけって一冊らしい・・・

巻末によく使う配列の確保に関するルーチンをまとめたものがある(nrutil.h / nrutil.c)


これの使い方メモ

参考ページ
http://macwiki.sourceforge.jp/wiki/index.php/NumericalRecipes

一次元配列の場合は

double *hoge
hoge = dvector(0, 10);

/* hogeを使った何か */

free_dvector(0, 10);


でおk
他の型なら、適時修正

領域を確保する配列はhoge[0]からhoge[10]の10個 11個
(この本では要素の0個目は紛らわしいからやめとけ、って書いてます)

最後の行は確保した領域を解放する



a[0] = *(a)
a[i] = *(a+i)

であることも覚えておくと便利だろう



二次元配列では


double **a

a = matrix(0,10,0,10);

for(i=0;i<11;i++){
for(j=0;j<11;j++){
a[i][j] = i*10+j;
printf("%lf ", a[i][j]);
}
printf("\n");
}

free_matrix(a, 0, 10, 0, 10);



たぶんこんな感じでおk


a[0][0] = **(a)
a[i][j] = *(a[i]) = *(*(a+i)+j)

であることも覚えておくと便利だろう
普段はEmacsを使っていますが、前回記事でデータ閲覧のためにmiを導入したと書きました。

デフォルトで文字が小さいのを直したり(おじさんにはきつい;;)
キーバインドを自分好みに設定したかったので色々といじる。


設定は

左上のmi > モード設定

から変更します。


設定画面


とりあえずフォントのサイズを11に
あとはキーバインドを変更


「ジャンプリスト」やら「最近開いたファイル」も不必要なので消したいのですが
どこでいじるのかまだよくわからない・・・・



ちなみにキーバインドの設定はエクスポートして他のマシンでも同様のバインドにすることができるみたいです
Emacsだと、起動するときに読み込む .emacs というファイルがこれに該当するのでしょうか
C言語でコードを書くときにはいつもEmacsを使っていた(正確にはCarbonEmacs)

ただ起動にちょっと時間がかかる。(.emacsを読み込んでるから?)

また、ウィンドウをもうひとつ作ろうと思うと、

ctrl+x
5
2

と打つ必要がある。

はっきり言って手間である・・・



そこで簡単なデータ閲覧用にmi(みみかき)を入れることにした。

mi公式

自分にあったパッケージを落としてくればよい

研究室のPCはスノレパなので

バージョン2.1.11r1
最終更新日:2011.4.17

これを入れておく。



ターミナルからの起動は
open -a mi

また
open -a mi hoge.dat
でmiを起動してhoge.datを開く事ができる。

open -a mi hoge.dat foo.dat
これでhoge.datとfoo.datを2つのタブを通して開くこともできる。


aliasとして(Cシェルでは)
setenv mi 'open -a mi'
を登録しておくと、もうちょい楽になるか
4月にこのMac miniを使い始めてから
今日やっとGSLをインストールしていないことに気づいた・・・・



インストールしたはいいものの、コンパイルするときのリンクを忘れてしまっていたのでメモ

gcc hoge.c -o hoge -lm -Wall -lgsl -lgslcblas
でいけるらしい

GSLがデフォルトの場所( /usr/local/include )にインストールされていれば
-I/usr/local/include -L/usr/local/lib
この二つは必要ない。


参考ページ
GSL日本語リファレンス置き場
http://www.cbrc.jp/~tominaga/translations/gsl/
strcpyを使えばよさげ

参考ページ
http://www9.plala.or.jp/sgwr-t/lib/strcpy.html


argv[1]に入ってるファイル名関連のファイルを読み書きしたいときにこれを使って編集する
今回はGIFアニメを作りたい過程でこれに遭遇



//なんか最近更新内容がずさん・・・
後の自分のためのメモ

例えば次のような関数があるとき
int hoge( int aa[], int nn);    #関数宣言

int hoge( int aa[], int nn){
   int i;
   for(i=0; i < nn; i++){
     aa[i]++
   }
   return 0;
}


この関数を実際に使うときは、配列とその要素数を引数として渡すが、そのとき[]はいらない

つまり
hoge(aa, nn);


これでおk
(なんか書いててわかりにくいなぁー)

c言語でfopenを用いて、ファイルを開くことができる
次のようにして開く
FILE *fp;
fp = fopen("hoge.dat","r");


この書き方ではカレントディレクトリのファイルしか開くことができない
そこで絶対パスを用いた書き方に変更する

fp = fopen("/Users/hoge/hoge.dat");


絶対パスの書き方はプラットフォームに依存するらしいので、
絶対パスをpwdコマンドを用いて確認する。

これでちょっとは便利になったかなぁー
研究室のMacにはGSLが導入されている。

GSLとは GNU Scientific Libraryの略で
numerical recipesに載っているプログラムが最初から使えるようなもので色んな計算の煩いを多少楽にしてくれる

詳しい導入の仕方などはこちら



で実際にコンパイルする際は、

gcc -I/usr/local/include-L/usr/local/lib -lgsl -lgslcblas

のようなリンクを貼らなければならない(環境によってlocalなどは変わる)
しかし、gccはデフォルトでヘッダファイルをusr/local/includeに見に行くのでもしGSLがデフォルトの場所にインストールされている場合は -I オプションは必要ない

ってここのpdfに書いてある。


しかしそれを確認するために
gcc -print-search-dirs

って打っても、gccがヘッダファイルを探しにいくディレクトリを表示させても /usr/local/includeとは書いてないんだよなぁー

わからん。



・追記

http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_3.html

>例外はディレクトリ`/usr/local/include'で、 ヘッダ・ファイルを探す際には、 コンパイラのインストール・ディレクトリにかかわらず、 このディレクトリが探索されます

最初から見に行くようになってるのかー納得ー

#include "hoge.h"

上の書き方では、カレントディレクトリでhoge.hというヘッダファイルを探し
次にgccコマンドラインの -Iオプションで指定したディレクトリを探し
最後にgccの標準ライブラリが探される。


#include <example.h>

こちらの書き方では、カレントディレクトリの検索を行わないそうです。
プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST

print "先月子供が産まれました!"

# 最終更新 2022/10/25
カウンター
カウンター カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (Twitterにてお知らせください)

Demo scripts for gnuplot version 5
(gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)

gnuplotスクリプトの解説
(米澤進吾さんの個人ページ、gnuplotと言えばこのかた)

gnuplot のページ
(Takeno Lab、うちのブログがリンクされていたのでリンク返し)

Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco
(映画の感想をまとめられるサイト、いつもお世話になっています)

Astronomy Picture of the Day Archive
(天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)

今日のほしぞら
(任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)

GNUPLOTとアニメーション
(応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)

読書メーター
(読んだ本をリストできる便利なサイト)

flickr難民の写真置き場
(20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)

教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定
(阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)

英語論文執筆用の例文検索サービス
(とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)


Template "simple02" by Emile*Emilie
忍者ブログ [PR]