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


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

C++相談室 part158



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桁も使っちゃうのはもったいないのよ






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

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

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