2008年4月アーカイブ
kkato (2008-04-28 11:09) | コメント(0)| トラックバック(0)
kkato (2008-04-25 22:10) | コメント(2)| トラックバック(0)
kkato (2008-04-21 16:42) | コメント(2)| トラックバック(0)
kkato (2008-04-18 11:15) | コメント(0)| トラックバック(0)
kkato (2008-04-16 17:53) | コメント(0)| トラックバック(0)
kkato (2008-04-16 10:02) | コメント(0)| トラックバック(0)
kkato (2008-04-14 12:54) | コメント(1)| トラックバック(0)
kkato (2008-04-11 17:52) | コメント(1)| トラックバック(0)
double pgPtrToDouble(char *ptr)
{
unsigned char tmp[8];
*(uint32_t*)&tmp[4]=ntohl(*(uint32_t*)ptr);
*(uint32_t*)&tmp[0]=ntohl(*(uint32_t*)(ptr+4));
double d = *(double*)tmp;
return d;
}
引数がchar*になっているのはpostgresの戻り値がそうなっているからです。これで動かしてみたのですが、うまく動きません。
movsd -24(%rsp), %xmm0
ret
アセンブリがよくわからない人に説明すると、このコードはC言語だと
unsigned char tmp[8];
return *(double*)tmp;
にあたります。つまり、メモリの中のゴミを返しているだけ。コンパイルの最適化によって途中の処理はすべて消されてしまっています。
double d = *(double*)tmp;
return d;
を見ると、dなんて余計な変数は必要ないからそのままtmpを返せばいいなということになると思います。でもその前の
*(uint32_t*)&tmp[4]=ntohl(*(uint32_t*)ptr);
*(uint32_t*)&tmp[0]=ntohl(*(uint32_t*)(ptr+4));
を見るとtmpには明示的には何も代入されていない(&演算子を使って間接的には書き換えられてますが)ので、tmpの値は何も変わらない(と思い込む)。
double pgPtrToDouble(char *ptr)
{
uint32_t tmp[2];
tmp[1]=ntohl(*(uint32_t*)ptr);
tmp[0]=ntohl(*(uint32_t*)(ptr+4));
double d = *(double*)tmp;
return d;
}
としたらうまくいくかと思ったのですが、なぜか同じ結果になりました。kkato (2008-04-09 16:35) | コメント(1)| トラックバック(0)
私は、社会人でありながら3年間大学院博士課程に在籍していて、今春に卒業しました。
その3年間の総括らしきものをここにまとめてみようかと思います。
良かったこと:
意外と良くなかったこと:
悪かったこと:
ということで、3年間非常に恵まれた環境で研究活動ができ、博士号もとれたわけですが、残念ながら博士号をとったからといって突然急激にグレードアップしたというわけではないです。でも、自分の持っている能力の引き出し方をもうちょっと多角的に考えることができたということが大きな収穫だったと思ってます。
kkato (2008-04-02 16:45) | コメント(0)| トラックバック(0)
プロフィール
kkato
・10年以上前からのdebian使いです。
・C++, Ruby, perl, ocamlなどの言語をよく使います。
・数値計算などが得意です。
・スパムメールの文面をよく読むのが好きです。
ホームページ:
http://sites.google.com/site/kimikazu/
カテゴリ
月別アーカイブ
Copyright (C) 2004-2011 Nihon Unisys, Ltd. All Rights Reserved.
Powered by Movable Type Open Source