[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/14 14:02 / Filesize : 217 KB / Number-of Response : 865
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part71



1 名前:デフォルトの名無しさん [2009/07/18(土) 02:54:58 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part70
pc12.2ch.net/test/read.cgi/tech/1244942050/l50

266 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 14:30:34 ]
>>264
秒単位の表示って、 0, 1, 2, ... とか?
それとも 0.0, 1.0, 2.0, ... なの?

あと、上記のプログラムって言ってコンパイルも通らないソースが貼ってあるのが怪しい。
省略したところに問題があるのかもしれない。

267 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 14:33:27 ]
265よ
ここはC++スレだぞ何故その方向へ逸れるの?

268 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 14:36:50 ]
参照じゃないといけない理由のほうがすごく気になるな
既存ソースの改造でもやってんのかな

269 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 14:46:25 ]
個人的に >>256-257 ってのは同意できるな

void hoge(char **pp)
return *(*pp)++; // わかりにくい。ってかタイピングが面倒
}



void hoge(char *&rp)
{
return *rp++; // ほらきれい
}

270 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 14:47:13 ]
voidじゃねえcharだた

271 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 14:51:16 ]
C++ code - 22 lines - codepad
ttp://codepad.org/QgkLwIsV

このようにコンパイル時エラーになってしまうのですが、
どうすれば解決できるでしょうか?

11行目と14行目のzeroを別名(hogehogeなど)にすれば
解決するのですが、そうではなく同名のまま(zeroのまま)解決したいと
思っています。

よろしくお願いいたします。

272 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 15:04:55 ]
>>271
メンバに同名の zero がある限り、クラス外の zero を指すなら ::zero などとスコープを
明示する必要がある。

template<typename int_t>
class MyTempl;

template<typename int_t>
bool zero(const MyTempl<int_t>& arg);

template<typename int_t>
class MyTempl
{
  int_t m_num;
public :
  MyTempl(int_t arg = 0) : m_num(arg) {}
  static MyTempl zero()
    {return MyTempl<int_t>(0);}
  friend bool ::zero<>(const MyTempl& arg);
  bool is_zero() const
  {return ::zero(*this);}
};

template<typename int_t>
bool zero(const MyTempl<int_t>& arg)
  {return arg.m_num ? true : false;}

template class MyTempl<int>;

273 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 15:13:43 ]
>>269
そんなことは誰も問題視していない

274 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 15:14:13 ]
More C++ Idioms/friend 関数の生成(Making New Friends) - Wikibooks
ttp://ja.wikibooks.org/wiki/More_C++_Idioms/friend_%E9%96%A2%E6%95%B0%E3%81%AE%E7%94%9F%E6%88%90(Making_New_Friends)

ここを読んではいたので、
friend bool zero<>(const MyTempl& arg);
とする方法は知っておりました。

しかし
friend bool ::zero<>(const MyTempl& arg);
この発想はありませんでした。

ありがとうございました!!



275 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 15:20:33 ]
本来初期化しかできない参照を変な使い方して
ほら綺麗 とか言われても

276 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 15:50:50 ]
変な使い方ってどこが?

277 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 16:10:15 ]
ポインタと参照は原理は同じだが違うものだよ。


278 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 17:05:08 ]
質問というか相談。以下のような多相性を目的としないクラス階層がある。

struct A {}; // 空の基底
struct B: virtual A { Foo foo; };
template<typename T> struct C: virtual A { T t; };
template<typename T> struct D: B, C<T> {}; // fooとtを両方持つ
// B, C, Dを保持するクラス、後でaをダウンキャストして使う
struct Holder { A *a; };

Holderを使う時に必要な型(Foo, T)は判っているが、A*の実際の型(B, C, D)は判らない。
この例だとAを仮想継承しないといけないが、そうするとB, C, Dのどれを実体化しても
サイズがポインタ分増えてしまう。これらを持つHolderは大量に作成されるので、
各オブジェクトのサイズは少しでも減らしたい。
どうしたらいいだろうか?やはり仮想継承するしかない?

279 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 17:12:12 ]
>>277
> ポインタと参照は原理は同じ
って何を根拠に。

確かに
参照はポインタを使って実現している実装が多いけど
それは言語仕様には規定されていないだろ。

正確には
ポインタと参照は同じ原理で実現できる
とかだな。



280 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 17:17:57 ]
>>278
よくわからないな・・・なんで仮想継承が必要?
普通に継承するのはだめなの?

281 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 17:28:05 ]
オレだったら struct Bのインスタンスを持った struct Cの特殊化を struct Dの親か Dの実装にするね

282 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 17:28:15 ]
>>264
int clock()
と仮定されて、intが返ってる可能性はないかね。

283 名前:278 mailto:sage [2009/08/07(金) 17:58:59 ]
>>280
D<T>*からA*にアップキャストするときB*経由かC<T>*経由かで
曖昧になるから仮想継承が必要…だよね?
ちなみにHolderから値を取り出すにはこんな感じの関数を使う。

Foo get_foo(const Holder &h) { return static_cast<B*>(h.a)->foo; }
template<typename T>
T get_t(const Holder &h) { return static_cast<C<T>*>(h.a)->t; }

>>281
済まないけどよくわからない…
特殊化するとA*からTを取り出すときにCを特殊化したかどうかの
情報が必要にならない?

284 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 18:13:52 ]
クラスの宣言中、そこに直接メンバ関数を実装すると
自動的にそのメンバ関数はインライン要請がなされると
聞きました。
では
クラステンプレートで
template<typename int_t>
class MyTempl
{
public:
void foo() const{std::cout << "foo";}
};
この様にした場合、foo()はインライン関数として扱われますか?
それとも
template<typename int_t>
class MyTempl
{
public:
inline void foo() const{std::cout << "foo";}
};
とする必要がありますか?



285 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 18:21:58 ]
>>283
つねにB経由にするなどと決めておけばいいかと
キャスト自体は曖昧な部分をちゃんと明示すれば通るし
D<T>* d = ... ;
A* a = static_cast<A*>(static_cast<B*>(d));

286 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 18:25:58 ]
>>284
扱われます
inlineは付けても付けなくても一緒
インライン展開したくない場合は

template<typename int_t>
class MyTempl {
public: void foo() const;
};

template<typename int_t>
void MyTempl<int_t>::foo() const {
std::cout << "foo";
};

などのように別に中身を書く

287 名前:284 mailto:sage [2009/08/07(金) 18:31:54 ]
>>286
分かりやすい解説ありがとうございました。

288 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 18:48:31 ]
逆に宣言に定義を含めてインライン化しないようにするにはどうするの?


289 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 18:59:04 ]
インライン関数をインライン展開しないというコンパイルオプションを付けてコンパイルする
クラス定義の中に定義を書いた関数はインライン関数だと規格で決まっているから、そこはどうにもならんよ

290 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 19:00:22 ]
>>286
テンプレート使った場合ってインライン展開されないようにできるの?
コンパイル単位的に難しい気がするんだけど

291 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 19:06:34 ]
>>290
普通にできる
ただしクラスの定義も各関数の定義も両方ともヘッダに書く
同じものがコンパイル単位ごとにコンパイルされても、リンカが重複分を破棄する等して上手くやる

292 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 19:10:13 ]
インライン展開は関数呼び出しのオーバーヘッドがなくなるけど
テンプレート関数はオーバーヘッドなくならんでしょ。

293 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 19:28:56 ]
そりゃなくならない
別物だし

294 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 21:57:42 ]
>>292
一人だけ別の話題をしているようにしか見えないぞw



295 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 21:58:55 ]
インラインのテンプレート関数使えばいいだけじゃん

296 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 22:05:57 ]
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所

297 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 22:12:41 ]
>>294
つまり、テンプレートはそもそも淫乱展開じゃないんじゃないの?って話。

298 名前:244 [2009/08/07(金) 22:17:43 ]
やはり難しいかったでしょうか?

わかる方がおられない残念な結果となったため、質問への回答を打ち切らせていただきます。

299 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 22:25:45 ]
アイちゃんより下がいるとは。

300 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 22:44:16 ]
>>298
単にスレ違いなだけ。
せめて、環境依存OKと言っているとことか、WindowsならWin32APIスレのほうで聞きなさい。
まあ、そこ行っても答えが貰える保証はないけど。

301 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 22:53:20 ]
スクリプトをC++で作るのって難しいと思うが、どうなの?

302 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:06:09 ]
難しくないよ

303 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:17:23 ]
class A{
A(char *buf);

}

A::A(char *buf){

buf= new char[10];
buf="gomi"

}
int main(){

char *buf
A kakuho(buf)

printf("%s",buf);

};

コンストラクタの中でメモリ確保したいんですが
できません。助けてください


304 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:25:05 ]
class A{
A(char **buf);
}

A::A(char **buf){
*buf= new char[10];
strcpy(buf,"gomi");
}
int main(){
char *buf
A kakuho(&buf)
printf("%s",buf);
};

かな



305 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:25:47 ]
strcpy(*buf,"gomi");だた

306 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:30:19 ]
なんでchar*を使うの?メモリ的な制約か?stringとか使えばいいじゃん。

307 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:31:16 ]
>>302
そなの?
COMとかActiveXなら作れるけどスクリプトはなんだか大変そうな気がして

308 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 00:13:27 ]
>>298
せめてアイちゃんレベルにはなって欲しいな。

309 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 00:15:33 ]
三項演算子a?b:cと
if elseを用いた構文が
意味的に同じ場合、
どちらが望ましいでしょうか?
(速さや可読性など。)


310 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 00:46:36 ]
俺のイメージでは、
式の一部として使うなら、三項演算子が読みやすく、
そうでなければif elseが読みやすい。
デバッグトレースするならif else。
実行速度はどっちもほとんど変わらん。

311 名前:309 mailto:sage [2009/08/08(土) 00:48:23 ]
>>310
ありがとうございます。


312 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 01:06:19 ]
>>309
自分の場合、三項演算は、参照型と const 変数の初期化や、戻り値
の分岐に限定して使用している。

313 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 01:29:28 ]
>>297
別に実体化してリンクしても問題ないが。

314 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 01:31:00 ]
並列化やベクトル化をするコンパイラの場合、分岐を使うと最適化を拒否られるが三項演算子だと最適化してくれたりする。
豆知識な



315 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 02:08:21 ]
コンパイラの例を挙げてくれてればよかったなあ。。。

316 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 05:51:46 ]
条件演算子と呼んでください。
いつか三項の仲間が増えてもごっちゃにならないように。

317 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 05:59:05 ]
>>309
よく考えたら、意味的に同じなんてありえなくね?

条件演算子は「 a が真のとき b 、そうじゃなければ c 」
if else 文は「 a が真のとき b をする、そうじゃなければ c をする」

処理の意味によってどっちに当てはめたほうが読みやすいかは決まってくるでしょ。
たとえば b, c が副作用を持つ場合に条件演算子だと読みにくいだろうなぁ、とか。

318 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 06:20:51 ]
a == true ? printf("true") : printf("false");

319 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 06:43:47 ]
printf(a ? "true" : "false");
こうだろjk

320 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 07:04:50 ]
printf("true\0false"+5*!a);

321 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 07:05:25 ]
無名namespace内でのtypedefについてなんですが、以下のコードは正しいでしょうか?

#include <iostream>
namespace{
typedef unsigned long ulong;
typedef unsigned int uint;
typedef unsigned short ushort;
typedef unsigned char uchar;
}
ulong a() { return 1; }
uint b() { return 2; }
ushort c() { return 3; }
uchar d() { return 4; }
int main(int argc, char** argv)
{
a(); b(); c(); d();
return 0;
}

これをCygwinのg++ 3.4.4でコンパイルすると
error: `uint' does not name a type
error: `ushort' does not name a type
というエラーが出ます(ulong, ucharについては何もエラーが出ません)。
ただし、#include <iostream> の行をコメントアウトするか、関数 a(), b(), c(), d() を無名namespace内に入れると
コンパイルが通ります。

これはCygwinのg++がおかしいのか、それともコードに問題があるのか、どっちなんでしょうか?

322 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:11:30 ]
無名namespaceって

::ulong

で参照しなかったっけ。

323 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:19:57 ]
今の時代Cygwinでファーストコード通してる人が居るんだなぁと
ちょっと意外に感じた。

324 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:23:24 ]
>>322
それはグローバルnamespaceじゃないですか?



325 名前:phenix mailto:sage [2009/08/08(土) 09:45:36 ]
>>301
boost::spiritを使うと簡単

326 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 10:03:46 ]
>>322
それはグローバルだな。
無名は特に外部から参照は出来ない。
その翻訳単位内でのみ参照可能。

327 名前:314 mailto:sage [2009/08/08(土) 10:12:26 ]
>>315
日立SR8000の最適化コンパイラ
って言っても縁ないでしょ。

328 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 10:26:48 ]
>>327
確かに縁がなさ過ぎるw

329 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 13:46:31 ]
>>327
縁がないから言ってもしょうがないでしょって思ってんのかな

330 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 17:58:04 ]
return で返される値は
返り値
戻り値
など色々呼び名があると思いますが、
C++用語としてはどれが正しいでしょうか?

331 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:28:25 ]
>>321
gcc -E してみたら、 /usr/include/sys/types.h でグローバルに uint と ushort の typedef が
あった。どうもこいつらが影響してるみたい。

ちなみに、ソース先頭で #define _POSIX_SOURCE しとくとこれらの typedef が無くなるんで、
ふつうに通るようになる。

というわけで、問題を縮小していくと以下の3行で同じ問題が発生する。

typedef int I;
namespace{ typedef int I; }
I i;

> :3: error: `I' does not name a type
> :3: error: extra `;'

typedef に限らず、グローバルスコープと無名名前空間の中に同じ名前の宣言があると、
宣言自体は通るのに、その後で実際には宣言された名前が使えなくなるみたい。

gcc のバグっぽいけど、標準ではどうなるべきなんだろうか?
2つの宣言のどっちを使うのか曖昧だからエラーになってほしいところ。

332 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:31:18 ]
>>330
いちおう、 JIS 規格では「返却値」。
ほとんどの場合はどれでも通じるから、どれが正しいとも正しくないとも思わないけどね。

333 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:33:05 ]
>>332
返却値ですか。
ありがとうございました。

334 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:46:09 ]
>>331
検証サンクスです。グローバルnamespaceと無名namespaceで重複するとおかしくなるんですね。
どっちが優先されるべきなのか少し調べてみましたが、よくわかりませんでした。
というか、宣言の時点でエラーなり警告なり出して欲しいですね。

とりあえずtypedefについては無名namespace外でも使う場合はグローバルスコープに置くことにしようと思います。



335 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:51:42 ]
でも、仮にグローバルnamespaceが無名namespaceより優先されるとしたら
名前の重複が起こった場合、無名namespaceの方には外側からアクセスできなくなっちゃいますね。
とすると本来は無名namespaceが優先されるべきなのかな??

336 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 00:39:45 ]
An unnamed-namespace-definition behaves as if it were replaced by
namespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }

つまり

typedef int Integer;
namespace{
typedef long Integer;
Integer l; //OK:long
}

Integer i; //NG
::Integer i; //OK:int

グローバルと重複したとき無名名前空間外から参照する方法はない
無名名前空間内では無名名前空間側が優先

337 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 01:27:03 ]
MyClassは自作のクラスで、そのコピーコンストラクタは重いとします。

MyClass foo()
{
//とても重い処理
return 〇〇;
}
この関数を呼び出した側で返り値を長く使いたい(ただし変更はしない)場合、
const MyClass retval
=foo();
とするべきか、
const MyClass& retval
=foo();
とするべきか
どちらが望ましいでしょうか?
コンパイラによる「戻り値最適化」が行われないとすれば前者は後者より重いと推測されますが、
コンパイラによる「戻り値最適化」が行われるとすれば前者は後者より参照の解決が不要な分 速いのではと思っているのですが、この理解で正しいでしょうか?

338 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 01:38:44 ]
>>337
戻り値最適化を行うような、処理速度について配慮されたコンパイラであれば、
テンポラリを束縛した参照について「参照の解決」などという処理に時間をかけることは
無いだろう。

339 名前:314 mailto:sage [2009/08/09(日) 02:42:42 ]
>>329
ひねくれたやっちゃな。
コンパイラ個別の特徴じゃないしな。
if文があったらループの最適化をサボるってのは。
それを3項演算子で抜けられる可能性があるってのは一般論として知っておいて損はないだろ。
具体的なコンパイラの名前が必要な話か?

340 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 02:53:37 ]
縁がないだろって思ってるコンパイラでしか有効じゃない機能をわざわざ紹介する理由は確かに分からん

341 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 03:59:56 ]
一般論に対して例外の存在を補足しただけじゃねーの。

342 名前:337 mailto:sage [2009/08/09(日) 10:12:42 ]
>>338
ということは、最適化が出来るコンパイラなら
どちらも同じだろうと言うことですね。

ありがとうございました。

343 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:39:44 ]
struct B
を継承するときに、
class cD : B
struct sD : B
これら二つの違いは何でしょうか?

cDはBをprivate継承していて、sDはBをpublic継承しているだけだと
いう理解でよろしいでしょうか?

344 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:40:38 ]
はい



345 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:40:57 ]
>>343 はい。

346 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:41:38 ]
ごめん

347 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:48:53 ]
えっ?

348 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:49:51 ]
えっ?

349 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:50:17 ]
えっ?

350 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:51:36 ]
えっ?

351 名前:343 mailto:sage [2009/08/09(日) 15:53:36 ]
ありがとうございました。

352 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:54:23 ]
いえいえ、どういたしまして。

353 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:10:44 ]
numeric_limits - C++ Reference
ttp://www.cplusplus.com/reference/std/limits/numeric_limits/
ここを読んでみましたが、
staticメンバ関数の
min()
epsilon()
この二つの違いが分かりません。
std::numeric_limits<double>::min()
std::numeric_limits<double>::epsilon()
の例で違いを教えていただけませんでしょうか?

なお、私の環境
Windows XP SP2
g++ (TDM-1 mingw32) 4.4.0
では
std::numeric_limits<double>::min() = 2.22507e-308
std::numeric_limits<double>::epsilon() = 2.22045e-016
となりました。


354 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:20:14 ]
>>353
min() は浮動小数点で表現できる最小の数
epsilon() は「機械イプシロン」を調べていただければわかるが、数値 1.0 とそのとなりにある実数との差
この二つは異なる概念なんですね。



355 名前:353 mailto:sage [2009/08/09(日) 16:21:31 ]
>>354
理解出来ました。
ありがとうございます。


356 名前:デフォルトの名無しさん [2009/08/09(日) 16:26:04 ]
>>353
minというのは、その名の通り、double型で表現できる(絶対値が)最小の値。
epsilonというのは、double型で表現できる、「1の次の」値から1を引いた値。

詳しくはIEEE754をよく読んで欲しいんだけど、要するにdouble型で表現できる値っていうのは
0付近では密で、絶対値が大きくなればなるほど疎になる性質がある。
例えばdouble型は0〜1の間には10億個ぐらいの表現できる値があるけど、
1〜2の間には800万個ぐらいしかない。

357 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:42:12 ]
みなさんありがとうございます。
申し訳ないのですが、

quiet_NaN()
Representation of quiet (non-signaling) "Not-a-Number", if available.
signaling_NaN()
Representation of signaling "Not-a-Number", if available.

この二つの違いも教えていただけますでしょうか。
前者が「静かな」というのが今ひとつ分かりません。

358 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:06:50 ]
>>357
一般的に、NaNというのはなんかエラーな感じの数のこと。
NaN+普通の数とか、普通の数÷NaNとか、とにかくNaNがどっかに含まれる演算を行なったとき、
・Quiet NaNを使ったときは、演算結果としてNaNを返す
・Signaling NaNを使ったときは、浮動小数点例外が発生する(0除算を行った時みたいに、プログラムの実行が停止する)

359 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:11:27 ]
多分だけど計算中にNaNが現れたときsignalを発生するかしないかじゃないかな?

360 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:46:22 ]
プログラム技術2ch掲示板のC++のスレ見ても、dynamic_cast演算子を使ったソース
がほとんど見掛けないな。皆そんなに使わないのかいな。大変な努力をして、
C++を学習したのに、それを使う機会が無いって、物足りないな、困ったもんだ。

361 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:49:16 ]
ダウンキャストかクロスキャストの時しか使わないじゃん

普通は仮想関数だけで十分

362 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:27:55 ]
>>360
goto と似たようなもんだ。使わないで済むならそれでいい。

363 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:31:35 ]
C++には多用しちゃいけない機能もあるからな
dynamic_castやtypeidもそうだし、あと例外指定とか

364 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:39:06 ]
>>363
mutable もだな。
reinterpret_cast 級の危険機能だと思う。



365 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:53:38 ]
使い方を間違えなければmutableは非常に役立つよ。

366 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:54:10 ]
いざという時に、せめて可能な限り安全にわかりやすく
ダーティーなやり口に手を染めるためのもの、という感じかな。

漫画によくある場面で喩えるなら、主人公が出発前に
「できればこれを使わずに済ませたいものだが・・・」
とか言いながら見つめてる武器みたいな。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<217KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef