- 1 名前:デフォルトの名無しさん mailto:sage [2021/11/15(月) 18:49:18.44 ID:I69rZ/Of.net]
- 前スレ
C++相談室 part157 https://mevius.5ch.net/test/read.cgi/tech/1628474251/
- 477 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 15:47:15.24 ID:msz2/cZB.net]
- 本来はrangeの出番なんだがな
導入が遅れたばかりに……
- 478 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 16:45:50.91 ID:fi3Z01x+.net]
- #include <iostream>
#include <vector> #include <array> #include <string> using namespace std; template<typename Iter> auto sum(Iter a, Iter b) { using value_type = remove_const_t<remove_reference_t<decltype(*a)>>; value_type acc {}; while (a != b) acc += *a++; return acc; } int main() { const int a[] { 1, 2, 3 }; vector<int> v { 4, 5, 6 }; array<double, 3> d { 3.5, 1.2, 0.9 }; const string s[] { "u", "n" "k", "o" }; cout << sum(begin(a), end(a)) << endl; cout << sum(begin(v), end(v)) << endl; cout << sum(begin(d), end(d)) << endl; cout << sum(begin(s), end(s)) << endl; return 0; }
- 479 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 16:51:06.96 ID:msz2/cZB.net]
- std::iterator_traits使おうよ
- 480 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 16:56:11.01 ID:fi3Z01x+.net]
- #include <iostream>
#include <vector> #include <array> #include <string> #include <iterator> using namespace std; template<typename Iter> auto sum(Iter a, Iter b) { using value_type = typename iterator_traits<Iter>::value_type; value_type acc {}; while (a != b) acc += *a++; return acc; } int main() { const int a[] { 1, 2, 3 }; vector<int> v { 4, 5, 6 }; array<double, 3> d { 3.5, 1.2, 0.9 }; const string s[] { "u", "n" "k", "o" }; cout << sum(begin(a), end(a)) << endl; cout << sum(begin(v), end(v)) << endl; cout << sum(begin(d), end(d)) << endl; cout << sum(begin(s), end(s)) << endl; return 0; }
- 481 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 17:32:40.16 ID:Ug1txKhz.net]
- sumがunkoは独創的だと思うけど、戻り値の型はテンプレート引数でいいかもね
- 482 名前:sage [2021/12/21(火) 18:15:52.03 ID:qDHWQ1/Y.net]
- ↓こんなコード書いてるんですが,もっとエレガントに代入できませんか?
a[0]=*ptr; a[1]=*(ptr+1); a[2]=*(ptr+2);
- 483 名前:蟻人間 mailto:sage [2021/12/21(火) 18:28:20.41 ID:NT9maPPc.net]
- ptr[1]
- 484 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 19:09:14.75 ID:qDHWQ1/Y.net]
- >>477
エレガントな回答ありがとうございます. 解決しました.
- 485 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 20:23:30.29 ID:iHW7b2cO.net]
- std::copy(ptr, ptr + 3, a);
僕はfor文のほうが好きです
- 486 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 20:25:38.21 ID:UPYLxpzi.net]
- C++98以前の化石
- 487 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 21:03:47.64 ID:msz2/cZB.net]
- std::copy_nもあるぞ
- 488 名前:デフォルトの名無しさん mailto:sage [2021/12/22(水) 18:49:46.59 ID:ycAkB2VB.net]
- >>479
>>481 こんなんもあるんですね.使わせてもらいます.ありがとうございました. 最近c++やり始めたんですが,ポインタが出てくるとギョッとします.
- 489 名前:デフォルトの名無しさん mailto:sage [2021/12/22(水) 19:44:38.16 ID:VkqlmauA.net]
- 何に使いたいのか知らないけど、C++やめてRustの方がいいんじゃないの?
- 490 名前:デフォルトの名無しさん [2021/12/22(水) 20:00:31.77 ID:j6Uulo2p.net]
- 高速grepツールとして有名なripgrepはRustで作られてるからRustは優れた言語なのだろう、ぐらいなことは察せられるが
- 491 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 08:08:59.49 ID:zbE03cOE.net]
- >>483
rustなんてプログラム初級者に勧めるなよ。 あんなの習熟した上級者向けの言語だわ。c++以上に初級者向け解説が無いのは致命的。 あと、Rustはスレ違いだからな。このコメにもレスするなよ。
- 492 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 09:13:28.05 ID:cFIeneRn.net]
- >>485
C++の方が難しいよ ポインタでギョッとするレベル=Cに抵抗があるなら、わざわざC++を使うよりはRustでいい 5chはコメとは言わない お前がレスしなければ良かっただけ
- 493 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 09:43:11.86 ID:TuHGjVDJ.net]
- Rust は良いアプローチだがどうしても記述量が多くなるから敬遠してる
- 494 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 11:51:22.33 ID:Gjq2t2pD.net]
- >>486
ポインタは名札のメタファーを使った説明が確立しているけど、所有権、譲渡、借用、ライフタイムの初心者向け説明はクソみたいのしか無いだろ。そんなもん初級者に紹介するなよ。 スレ違いでわざわざ役立たずを紹介するやつは何を考えているんだろうかね?
- 495 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:29:11.30 ID:cFIeneRn.net]
- >>488
はいはい、ID変えてご苦労さま 同じことだけど、生アドレス使うの得意でない言語の方が向いてるだろってだけ C++は少なくともCをまともに使えるようになってから習得すべき
- 496 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:33:21.82 ID:lsirm1I0.net]
- .hや.cpp以外からいじられたくない変数に対するインライン関数をパブリックに公開したいのですが、classを利用する以外にこのような事はできないのでしょうか?
staticや無名名前空間を利用するとcppファイルで利用できなくなりますしやはりclassを使えということでしょうか? extern int value; //これは隠蔽したい inline bool IsZero() { return value == 0; } //これはグローバルに利用してもらいたい
- 497 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:43:43.47 ID:N07J633j.net]
- namespace {
extern int value; //これは隠蔽したい } inline bool IsZero() { return value == 0; } //これはグローバルに利用してもらいたい
- 498 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:44:08.09 ID:IRDqWaPI.net]
- >>489
ならc紹介しろよ。 スレ違いのクソを紹介するな。
- 499 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:44:27.15 ID:N07J633j.net]
- もとい
namespace { int value; //これは隠蔽したい } inline bool IsZero() { return value == 0; } //これはグローバルに利用してもらいたい
- 500 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:47:57.55 ID:IRDqWaPI.net]
- >>493
関数内にstatic変数持てなかったっけ?
- 501 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:52:37.53 ID:IRDqWaPI.net]
- >>494
連投失礼。 自身の関数内にあるstatic変数の参照を返す関数を用意するパターン無かったっけ?
- 502 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:58:20.57 ID:cFIeneRn.net]
- >>492
ポインタに抵抗ある人にCを勧めるくらいならC++に近くて安全なRustを勧めるのが筋 見当違いな話をしてるだけだよ君は
- 503 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:59:07.12 ID:6GqfEn2+.net]
- valueの立ち位置が気になるが
extern(実行ファイル内で全部共通)するならinline関数のIsZeroが見えた時点でvalueも見えてないといけない
- 504 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 13:03:49.15 ID:cFIeneRn.net]
- class hoge {
static int value; public: static bool IsZero() { return value == 0; } }; inline bool IsZero() { hoge::IsZero(); } int main() { return IsZero(); }
- 505 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 13:07:02.43 ID:lsirm1I0.net]
- >>493
ありがとうございます ヘッダにそれを書いたとしてcppファイルからvalueを扱えるのでしょうか? >>497 JavaやC#で言うところのprivate static intとして該当ヘッダ内&cppファイル内からは自由に扱え、それ以外からは見えなくさせたいという値です
- 506 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 13:20:56.47 ID:cFIeneRn.net]
- JavaやC#でもそんなところに可視性の定義はない。
- 507 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 17:32:16.18 ID:SEEFcByD.net]
- >>496
相手がなんでc++を使っているのかのニーズすら確認しないで何を独りよがりなことを言っているんだよ。 相手の目的を無視してスレ違いのツールを薦めるのはアホのやること。 Rustの伝道師はこんな低レベルなのかね。
- 508 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 17:36:54.99 ID:N07J633j.net]
- あーうるせえ
C++スレでRust Rust連呼すんな 寒すぎんだよ
- 509 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 18:02:45.75 ID:cFIeneRn.net]
- >>501
別に俺はRustの伝道師ではないが、>>483で一言Rustを勧めたらIDをコロコロ変えながら文句を言ってくる人がいるだけ ポインタが不得意でRustも使えない質問者ご本人様だと思ってる
- 510 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 19:12:55.62 ID:AUfS9hAV.net]
- >>493
試してないけどこんなのはどうかね。 #include <iostream> #include <cstdlib> class Accesser; class Wall { static int & val(){ static int v; return v; }; friend Accesser; }; class Accesser { public: Accesser(){ int &v=Wall::val(); v=1; } ~Accesser(){ std::cout << Wall::val()<< std::endl; } }; int main() { Accesser a; std::cout << "Hello, Wandbox!" << std::endl; }
- 511 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 19:32:24.95 ID:3yOXD4ws.net]
- inlineで書きたいらしいので、それだとコンパイル単位で値が変わっちゃうのでは?
- 512 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 19:55:38.05 ID:CLdJLYY1.net]
- >>505
インラインはどのみち無理じゃない? 関数内static変数は共通になる保証があったと思う。どこだか忘れたけど。
- 513 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 20:02:52.87 ID:cFIeneRn.net]
- クラス内に実装を書くなどヘッダにあればどの道インラインだと思う
- 514 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 20:05:51.29 ID:cFIeneRn.net]
- staticは静的に確保されるので、インライン展開されても同じシンボルを参照する
- 515 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 20:30:35.89 ID:cFIeneRn.net]
- ちゃんと書いておくと、>>490にもともとクラスを使わない指定があるので、どうかね?
という意味では前提を満たしてないと思う クラスを使う最も素朴な例は>>498に書いておいた
- 516 名前:デフォルトの名無しさん [2021/12/23(木) 21:54:27.28 ID:4lOSoN0i.net]
- メモリ確保用途でvectorやstringつかい
ポインタアクセスすれば、new で確保するのと速度に大差ないとおもうんですが 実測すると10%〜くらいSTLつかうほうが速度低下するみたいなんですが 直メモリアクセスでも落ちるのはなぜなんでしょうか
- 517 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 22:14:02.53 ID:6YhOrdG1.net]
- その計測コード貼ってみ
多分メモリアクセスとは関係ない所で時間食ってる
- 518 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 22:16:19.47 ID:lsirm1I0.net]
- >>509
ありがとうございます やはりクラスを利用しないと実現無理そうなので、498のようなC#で言うところのstatic class的な形でやることにします
- 519 名前:510 [2021/12/23(木) 22:21:06.77 ID:4lOSoN0i.net]
- これです・・・
https://ideone.com/NKSCRi vector : 974.971 ms new char : 921.191 ms new int32 : 899.579 ms
- 520 名前:デフォルトの名無しさん [2021/12/23(木) 22:38:03.27 ID:MjSWMWRR.net]
- 1秒もかかる?
- 521 名前:510 [2021/12/23(木) 22:49:58.53 ID:4lOSoN0i.net]
- こっちだと大差がついてるんですが
家のPCでもideone.comよりも差が付きます vector確保のほうが遅い https://paiza.io/projects/9wWo36-bjTCL_S0WcGbaWA vector : 459.154 ms new char : 184.758 ms new int32 : 167.899 ms
- 522 名前:510 [2021/12/23(木) 22:55:16.12 ID:4lOSoN0i.net]
- 自己解決しました
メモリ確保と解放部分を含めて計測してたのを コピー部分のみの測定にしたらほぼ一緒になりました https://paiza.io/projects/ge5iOWrzGu2E2PjogsRlUw vector : 219.947 ms new char : 204.565 ms new int32 : 214.644 ms
- 523 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 22:55:24.77 ID:6YhOrdG1.net]
- ほとんどメルセンヌツイスタの実行時間じゃね
- 524 名前:デフォルトの名無しさん [2021/12/23(木) 22:56:40.08 ID:MjSWMWRR.net]
- 確保にかかってると思う?
一秒はさすがにないと思う。 何かおかしいな。
- 525 名前:デフォルトの名無しさん [2021/12/23(木) 22:58:15.18 ID:MjSWMWRR.net]
- vector云々以前に、newバージョンも遅すぎると思う。
話にならないくらい。 i8008とかじゃないよね?
- 526 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 23:00:56.66 ID:6GqfEn2+.net]
- C++/CLIでstd::mutex使えないのなんでなん?
頑張ってWin32APIで代用する気力はあるけどわざわざ無効化されてる理由が知りたい
- 527 名前:510 [2021/12/23(木) 23:05:52.89 ID:4lOSoN0i.net]
- メモリ確保・解放と、メルセンヌツイスタを外して計測したら
今度はvectorのほうが圧倒的に早
- 528 名前:「んですが
https://ideone.com/rKv4qv vector : 237.55 ms new int32 : 713.82 ms [] - [ここ壊れてます]
- 529 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 23:26:56.25 ID:4lOSoN0i.net]
- 計測時間は、ある程度の長さで、オンライン実行環境のタイムアウトにならないように
ループ回数を変更してるので
- 530 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 23:54:08.59 ID:58w1xOUi.net]
- 生ポインタにしたら同じ感じにならない?
unique_ptr<int32_t[]> p(new int32_t[2*size]); int32_t* A = p.get(); mmcpy(A, size);
- 531 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 01:54:49.07 ID:T9e6TA98.net]
- 手動でループ回数変更とか馬鹿らしいからquick-bench.comとか使うのオススメ
- 532 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:00:08.27 ID:opQHMY4K.net]
- overrunがある
std::make_uniqueを使え
- 533 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:04:03.38 ID:opQHMY4K.net]
- https://ideone.com/JupGoY
- 534 名前:デフォルトの名無しさん [2021/12/24(金) 09:05:00.82 ID:6d0f054m.net]
- サンプルコードだからと安易にnew演算子使う風潮やめたほうがいい
コールバックや別スレッドに渡すインスタンスの生成にのみnew演算子を使うべき
- 535 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:08:39.52 ID:opQHMY4K.net]
- そういうことではなくunique_ptrを理解してから使えというだけ
- 536 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:09:02.65 ID:6d0f054m.net]
- バッドノウハウがいつまでたってもなくならない原因は入門者向けのサンプルコード
- 537 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:09:36.51 ID:opQHMY4K.net]
- そもそもサンプルコードの質が悪すぎる
- 538 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:10:57.45 ID:opQHMY4K.net]
- 今回のね(>>526)
- 539 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:11:48.94 ID:6d0f054m.net]
- >>528
むしろ「理解してなくても使え」だよ ナマポだってそうだ サティアンとか金目とかじゃなくてな 実際に使って痛い目にあわないと
- 540 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:12:11.50 ID:opQHMY4K.net]
- >>462は壮大な勘違い
- 541 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:13:48.09 ID:opQHMY4K.net]
- >>532
何でもそうだが、理解しないで使うからこういう問題が跡を絶たない 「理解してなくても使え」が何よりも悪い
- 542 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:21:12.05 ID:6d0f054m.net]
- >>534
それは違う 使わなければ理解できないよ 自身が初心者だった頃を思い出せないくらい耄碌したの? お大事に
- 543 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:22:45.08 ID:opQHMY4K.net]
- >>535
俺は初心者の頃から理解できていないものを何となく使うとかはしていない それが何よりも悪いことを教わってきてるから
- 544 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:25:48.61 ID:ZnDQBfvC.net]
- 練習と本番を一緒くたにしてるな
まさに現場の癌だったと自白してるようなものだ
- 545 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:28:20.47 ID:opQHMY4K.net]
- まさにお前がな
- 546 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:30:24.34 ID:opQHMY4K.net]
- コロコロID変わる質問者兼劣悪回答者の荒らしで、そもそも勤務経験なさそう、と思ってるよ
- 547 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:31:16.13 ID:6d0f054m.net]
- >>536
現役離れてずいぶん経つの? 実務やってれば仕様書の文章があいまいで実際に動かさないと理解できないってことがいくらでもあるでしょ 「仕様書はない、ソースのみ(キリッ」という状況なんて普通なはずだが
- 548 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:32:13.38 ID:6d0f054m.net]
- 教わるとか受け身かよ、アホかと
学ぶんだろ
- 549 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:35:00.51 ID:6d0f054m.net]
- 上司が「お前は触るな」と言いたいのをオブラートに包んで「理解してから触れ」と言われたクチだろう
できないPGだった証拠
- 550 名前:デフォルトの名無しさん [2021/12/24(金) 09:36:56.46 ID:6d0f054m.net]
- 「理解してから使え」なんて、危なっかしい無能な人を開発現場から穏便に排除する時に使う言葉だよ
- 551 名前:デフォルトの名無しさん [2021/12/24(金) 09:42:48.15 ID:6d0f054m.net]
- 肩叩きされていたことに気づけないくらいに読解力が低い
- 552 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:48:44.26 ID:ZnDQBfvC.net]
- 「理解してから使え」
「はい、理解してきます」 「理解しました!今度こそ大丈夫です」←わかった気になってるが自分が何を分かっていないのかがわからない
- 553 名前:デフォルトの名無しさん [2021/12/24(金) 09:54:19.02 ID:6d0f054m.net]
- 普通は他人に迷惑かけることなく作業しろ、って言えば良いいんだけど、
察するに上司はそれまでの積み重ねで追放する気満々だったんじゃないかな
- 554 名前:デフォルトの名無しさん [2021/12/24(金) 10:05:26.45 ID:6d0f054m.net]
- unique_ptrやshared_ptrは初心者でもコンパイラのエラーや警告に従うだけで安全にコードを書けるようになるからおススメだと思うよ
もちろん頓珍漢な警告メッセージを出力する不親切なコンパイラだとそうはいかないが
- 555 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 12:58:00.18 ID:a16a8gMY.net]
- 下らない煽りを何回にも分けて書くな無能
- 556 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 15:17:39.58 ID:miWR5HNI.net]
- コールバックや別スレッドに渡すインスタンスの生成であっても
new演算子を使わねばならない必然性は無いので ていうかnewしたブツを渡した先でdeteteさせる設計のは newしたコードとdeleteするコードが同じCRTでないと危険なので 異なるプロジェクトの間でやるのは一般にアンチパターンなので 1. そもそも渡さない(利用するスレッドに生成させる 2. (どうしても渡したい場合は)コピーして渡す 3. オブジェクトの所有権を渡す側のスレッドが握って生存期間が利用期間を包含することを保証する のどれかなので
- 557 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 15:18:01.17 ID:miWR5HNI.net]
- 少なくともウィンドーズのDLLはDllMain()を有する1本のプログラム同然なので
Ver.0.1のCRTをスタティックリンクしたDLLというものが作れてしまうので Ver.0.2のCRTとリンクされるコードで生成したオブジェクトのポインタを渡せてしまうので
- 558 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 15:49:34.78 ID:/YMztZoD.net]
- のでので言ってるだけで結論がない
頭悪そう
- 559 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 21:39:56.11 ID:0AIK3bm0.net]
- ActiveX系使ったことないんだろうなって容易に推測でける
- 560 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 23:47:20.34 ID:miWR5HNI.net]
- しらそん
COMオブジェクトの中で異なるバージョンのCRTの混在が起きたら 同じことなんじゃないの
- 561 名前:デフォルトの名無しさん [2021/12/26(日) 01:42:46.74 ID:Fmrpdwj0.net]
- アウトプロセス
- 562 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 02:08:50.44 ID:rFpP4pcL.net]
- しらそん
アウトプロセスサーバが生成する COMオブジェクトの中で異なるバージョンのCRTの混在が起きたら 同じことなんじゃないの なので
- 563 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 02:10:54.75 ID:P9feSsDc.net]
- 自演って見苦しいな
- 564 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 05:25:00.76 ID:0FjCQ3kx.net]
- >>549
そういうのをスマポでやれって話? ヘッダで提供されるライブラリだからスマポもダメだと思うんだけど
- 565 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 05:43:12.94 ID:a8PAglQ+.net]
- >>552
急にCOM持ち出すのはおかしいだろ >>553 ふつーCoTaskMemAllocじゃねえかな
- 566 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 07:28:31.98 ID:z66Mwoku.net]
- sin関数に入れる時間変数の値が大きくなるにつれ誤差が増えていって困ってます
fmod関数を使ってもあまり効果が見られませんでした 処理時間をそれほどかけずに解決出来る良い案何かありますか? sin関数に入れる値の目安は100万くらいです
- 567 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 09:18:24.17 ID:6eMF2SNy.net]
- 100万をsin()しても、sin()は2π周期
doubleの精度15桁中の5桁以上を無駄にしている sin()する用変数で毎回fmod(,2π)してもそこで誤差が貯まりそう boost::multiprecisionとか?
- 568 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 09:35:40.45 ID:/woV9P1D.net]
- 出来るなら入れる数を作る時点で[0,2pi)に収まるように工夫する
それが無理なら多倍長浮動小数点数のライブラリ使うか自作するか
- 569 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 10:28:27.14 ID:a8PAglQ+.net]
- >>559
sinの引数に入れる値を浮動小数点数で少しずつ足しこむような処理をしているなら、やめて別の方法を考えろ
- 570 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 11:32:37.05 ID:SV9DgXqP.net]
- sinに時間を入れるのは次元がおかしい
っていうのは冗談で、質問者が何を問うてるのかわからん sinにdoubleに収まるどんなデカい数を入れても精度は15桁くらい保証されるでしょ >>560 > 100万をsin()しても、sin()は2π周期 > doubleの精度15桁中の5桁以上を無駄にしている これもわけわかんねー 100万近いある数 x をsin()に入れるんでしょ? x も sin(x) も上から15桁全部有効な桁でしょ 何が無駄になってるん? >>562 こういう話ならわかる
- 571 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 12:03:23.64 ID:/woV9P1D.net]
- sinのテイラー展開にxの大きな累乗が現れるからだよ
100万をバンバン累乗した級数で値域[-1,1]の関数計算してたら誤差まみれになるのは直感的に分かるだろ
- 572 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 12:47:17.91 ID:6eMF2SNy.net]
- >>563
318310 * pi が100万に近い2piの倍数 https://keisan.casio.jp/calculator で、14桁で計算する 2 * pi = 6.2831853071796 sin(6.2831853071796) = 1.3523E-14 318310 * pi = 1000000.3575642 sin(1000000.3575642) = 3.291426496E-8 わかった? 桁数同じだから、でかい数は細かい所が消えるのよ
- 573 名前:デフォルトの名無しさん [2021/12/26(日) 15:05:31.07 ID:N3NYq5+A.net]
- わかんない。
- 574 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 15:55:33.50 ID:SV9DgXqP.net]
- >>565
現象としては確認できたが、理屈が分からない >>564の言ってるようにテイラー展開の各項が激しくキャンセルし合って桁落ちするってこと?
- 575 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 16:03:55.94 ID:6s7ujcJo.net]
- >>564
のテイラー展開は疑問なんだけど 関数が[0,pi/2.)への押し込みもやってくれるんじゃないの
- 576 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 17:28:50.32 ID:6eMF2SNy.net]
- 「桁数同じだから、でかい数は細かい所が消える」が理屈のつもりなんだけど…
sin(6.2831853) = -7.179586477E-9 だし、 sin(1000000.3575641670857) = -3.5E-14 だよ
- 577 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 17:52:52.66 ID:6eMF2SNy.net]
- sin()の結果に13桁の精度が欲しいなら、入力値に小数点以下13桁の精度が要るのよ
sin()は2piの周期関数だから 1000000の所に7桁も使っちゃうのはもったいないのよ
|

|