C++相談室 part160

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2022/04/15(金) 08:39:32.42ID:WMzvufu2
前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1645239402/
2022/05/01(日) 14:53:21.11ID:vJsN8meg
こんなんでいいんじゃね
mytype* p = reinterprit_cast<mytype*>(0xaabbccdd);
*p = 1000
2022/05/01(日) 14:55:46.12ID:t4/NhzPt
他のプロセスからってことじゃないの
WindowsならReadProcessMemory/WriteProcessMemory
2022/05/01(日) 14:56:17.49ID:KjQtFKQ9
アドレスがわかってると言いながら実は空間が違うとか。
530デフォルトの名無しさん
垢版 |
2022/05/01(日) 14:58:07.61ID:ukM6vErn
すみません、説明不足でした。
自分がやりたいのは、あるプロセスの変数をc++で作った別のプログラムから書き換えることです。
a.exeが持つ変数をb.exeから書き換える、みたいなことです。
2022/05/01(日) 15:03:02.21ID:9TCpWNNH
linux的にはptraceを調べるとか…
2022/05/01(日) 15:07:04.74ID:t4/NhzPt
リバースエンジニアリングでしょ
環境依存だしここで有益な答えが返ってくるとは思えない
2022/05/01(日) 15:07:49.80ID:k85aGXIq
実行時に書き換えるならば排他制御が必須
2022/05/01(日) 15:11:01.84ID:Z9kcLIQb
スタック変数やヒープ変数を実行前に書き換えるのは不可能
535デフォルトの名無しさん
垢版 |
2022/05/01(日) 15:13:35.34ID:ukM6vErn
皆さんありがとうございます。
>>528さんのものが使えるかもしれないので、一回調べながら触ってみます。
2022/05/01(日) 15:47:36.66ID:V8gMjhaX
>>534
プロセスって言ってんだから実行中の話だろうjk
2022/05/01(日) 16:19:28.57ID:pvwx8N/t
>>521
oneapi でなく openapi というのがあるの?
538デフォルトの名無しさん
垢版 |
2022/05/01(日) 16:52:28.16ID:ukM6vErn
readprocessmemory, writeprocessmomoryの詳しい使い方が載ってるサイトってありますかね...
2022/05/01(日) 18:15:25.12ID:fSFndGfw
>>513
マジか
結局キャストだな
中途半端で使えない機能なんか付けんなよ
2022/05/01(日) 18:35:08.33ID:qIevfvlJ
>>538
https://docs.microsoft.com/ja-jp/windows/win32/api/memoryapi/nf-memoryapi-readprocessmemory
https://docs.microsoft.com/ja-jp/windows/win32/api/memoryapi/nf-memoryapi-writeprocessmemory
プロセスハンドルとアドレスと大きさを指示するだけで難しいことはなんもない。

ターゲットになるプロセスを見つける方法とかはたぶんこのあたりが参考になるかな……
https://docs.microsoft.com/ja-jp/windows/win32/psapi/enumerating-all-processes

公式ドキュメントは全体像が掴みづらい場合もあるけど、
この場合はたいした規模の話でもないからこれで十分でしょ。

外部のプロセスから逐一コピーして操作するのが面倒なら DLL Injection でプロセス内にプログラムを注入する方法もあるよ。
2022/05/01(日) 18:37:39.22ID:dvAJjIlE
srd::vectorも最初は誰がこんなクソコンテナ使うんだよっ
て言われてて皆好き勝手に独自のコンテナ実装してたらしいなw
2022/05/01(日) 18:42:14.03ID:Rd1MW222
>>539
まあ結構ニッチだと言うのとリンク先にも書いてある通り
struct STRUCT {
int* array;
};
int STRUCT::*pt = &STRUCT::array[2];
ってやられたら違うコードにしないといけないから面倒なんだろうね
543デフォルトの名無しさん
垢版 |
2022/05/01(日) 18:48:00.04ID:ukM6vErn
>>540
ありがとうございます!試してみます!
2022/05/01(日) 18:54:08.08ID:fSFndGfw
>>542
その例を上げるのはメンバポインタがわかってない人と思う
2022/05/01(日) 19:01:02.73ID:fSFndGfw
その例は構造体の中のintを指してないから
出来ないのは当たり前
546デフォルトの名無しさん
垢版 |
2022/05/01(日) 21:50:45.69ID:t6KXJfhj
>>521
oneapi最適化性能ショボくね?
Ryzenだからかもしれんがgfortranと速度同じくらいでビビったわ。
2022/05/01(日) 22:03:23.83ID:Rd1MW222
>>544-545
だからできないって話なんだがw
548デフォルトの名無しさん
垢版 |
2022/05/02(月) 06:08:38.44ID:9K9pP+jI
struct STRUCT
{
int array[2];
};

arrayはSTRUCT直属のメンバだからメンバポインタで指せるが
array[1]はあくまでarrayの要素であってSTRUCT直属のメンバではないので
これを指すようなメンバポインタは存在しない
2022/05/02(月) 06:48:46.84ID:LNpTFVSP
classのメンバ関数型が存在しない理由って何?

classのメンバ関数へのポインタのことではないよ
関数型も関数への参照も関数へポインタも認めてるのになぜメンバ関数は存在しないんだ
2022/05/02(月) 07:02:09.71ID:8dvAAWOX
できない話をいつまでもしてるのは脳に何か障害でもあるのか?
2022/05/02(月) 07:08:05.16ID:LNpTFVSP
理由を問うているんだけ、理解できないのか

脳に何か障害でもあるのか?
552デフォルトの名無しさん
垢版 |
2022/05/02(月) 07:36:33.49ID:9K9pP+jI
void func(void (CLASS::*pm)(), CLASS& ref)
{
*pm; //Error. メンバ関数ポインタには逆参照演算子が存在しない
(ref.*pm)(); //pmを実体化するには.*か->*しかない
}
メンバ関数型というのがもし存在するなら*pmのはずだが現実にはできない
2022/05/02(月) 07:56:46.72ID:LNpTFVSP
出来るできないを聞いているわけじゃない・・・
日本語理解できますか?
2022/05/02(月) 08:09:32.17ID:rW7ccw75
単純な逆参照*pmができるメンバ関数型はすべからくクロージャなるべし?
class Foo a;  // std::string Foo::someMemberFunc(int a, int b, double c)を持つ
class Bar b;  // std::string Bar::anotherMemberFunc(int a, int b, double c)を持つ

auto someMemberFunc = [=, &a](int a, int b, double c) -> std::string { return a.someMemberFunc(a, b, c); };
auto anotherMemberFunc = [=, &b](int a, int b, double c) -> std::string { return b.anotherMemnberFunc(a, b, c); };

std::function<std::string(int, int, double>* pm;
pm = &someMemberFunc;
std::cout << (*pm)(1, 2, 3.4); // a.someMemberFunc()が呼ばれる
pm = &anotherMemberFunc;
std::cout << (*pm)(5, 6, 7.8);  // b.anotherMemberFunc()が呼ばれる
std::function<std::string(int, int, double)> fn = *pm;  //  b.anotherMemberFunc()が呼ばれるためのクロージャにデリファレンスされる
2022/05/02(月) 09:03:37.01ID:8dvAAWOX
>>553
自分が欲しい機能は全て揃ってないとおかしいとかガイジすぎだろw
2022/05/02(月) 09:06:55.61ID:6vh8Gvry
あれが「揃ってないとおかしい」と読める読解力の方に問題がありそうだが
2022/05/02(月) 10:01:16.40ID:8dvAAWOX
理由「仕様です」ということも理解できないの?
まじで脳障害を疑った方がいいぞw
2022/05/02(月) 10:12:11.24ID:Lc/e3xtf
仕様がクソすぎる
559デフォルトの名無しさん
垢版 |
2022/05/02(月) 11:03:41.58ID:/YgtvrIl
無能ワイ、メンバ関数型がなんなのかよく分からない
2022/05/02(月) 11:30:26.72ID:m3O8Sm5F
ちんちんシュッ!シュッ!シュッ!
2022/05/02(月) 11:53:48.09ID:JwCZPFEF
>>549
適切な規格化(めんどくさい)や新たな実装(めんどくさい)が必要なわりに見合う有用性が無いと考えられているからでしょう。
562デフォルトの名無しさん
垢版 |
2022/05/02(月) 12:05:29.20ID:9K9pP+jI
>>553
いいだろう
では、仮にあったとしてどんな使い方を考えているんだ?

decltype(CLASS::func) mirror;
CLASS obj;
obj.mirror(); //これでobj.func();になればいいのか?
563デフォルトの名無しさん
垢版 |
2022/05/02(月) 12:29:35.60ID:9K9pP+jI
operator ?: がない理由も
仮にあったとして以下略への答えがないからだね
2022/05/02(月) 12:40:24.60ID:+FOPwlZG
>>559
安心しろ。俺もわからん。
2022/05/02(月) 13:38:33.63ID:WQmMvuhJ
>>547
違う話を出してきて出来ないと主張されても

>>548
メンバポインタの実体はただのアドレスのオフセットなんだから出来て良い
実際offsetofは出来る

結局制約が多過ぎてoffsetofとキャストを使うことになるなら
非常に中途半端な拡張と言わざるをえない
2022/05/02(月) 13:50:32.84ID:dhIldcoi
>>565
メンバでないものをメンバポインタの範囲で扱うことは出来るけど「やるべきでない」からやってないって話だろ。
まあそれを言ったら C++ には奇妙なものはいっぱいあるから今更ではあるけどさ。

それに offsetof は offsetof で色々と制約があるからなぁ。
特にスタンダードレイアウトである必要がある (そうでないときは未定義) というのがなかなか厳しい。
可能な場合には型システムの枠組み内で扱いたい。
2022/05/02(月) 14:01:47.48ID:8dvAAWOX
>>565
仕様として出来ないことと実現不可能なことの区別もつかないのかよw
2022/05/02(月) 16:26:17.62ID:WQmMvuhJ
>>566
配列の要素はメンバ
ではないと
まあそんな言葉の定義はどうでもいいとして

なぜやるべきでないと思う?
出来たら何がまずい?
何が不都合?
誰もこの点にふれてない

ただ単に仕様と言われても
その仕様が糞と思うだけ
569デフォルトの名無しさん
垢版 |
2022/05/02(月) 16:53:07.08ID:9K9pP+jI
>>568
よくわからんが、こう言いたいの?
struct STRUCT
{
int array[2];
};

int STRUCT::*pm;
pm = &STRUCT::array[0];
pm = &STRUCT::array[1];
STRUCT obj;
(obj.*pm) = 1; //obj.array[1] = 1; こうなるべき
2022/05/02(月) 17:15:19.01ID:dhIldcoi
>>568
は?

> どうでもいいとして

> 誰もこの点にふれてない

触れたことを勝手に無かったことにしてるのはお前じゃん。
あほか。
571デフォルトの名無しさん
垢版 |
2022/05/02(月) 17:32:38.90ID:9K9pP+jI
>>568
どうでもよくないぞ
オブジェクトが何に属するのかは
OOPの根幹に係わる重要なことだ
2022/05/02(月) 17:34:25.32ID:JwCZPFEF
>>570
配列の要素がメンバでないことは、現状のメンバ変数へのポインタが配列要素に適用できない理由を示すものと思いますが、
メンバ変数へのポインタを配列要素に適用可能にするという拡張の話について「やるべきでない」という理由にはならないかと。
2022/05/02(月) 17:56:52.90ID:dhIldcoi
>>572
そいういう拡張はあり得ると思う。
私の感覚では (メンバ内の) 配列の要素を許すのだともはやメンバポインタではない何かだろうという意識で書いてた。

つまり、メンバポインタとしてやるべきではないということと、
メンバポインタを拡張して出来上がる何者かで出来るようにするというのは両立するってことね。
2022/05/02(月) 18:01:04.13ID:+FOPwlZG
なんとなくわかったけど、
c において配列を指す変数がポインタと同一視されるんだから、cを踏襲するc++でも配列を指す変数がポインタ扱いになるのはおかしなことじゃない。そうすると配列の要素はポインタの先になるので、配列を指すメンバー変数の要素もポインタの先になってメンバーじゃなくなりますな。
というか、こんなくだらないことでゴチャゴチャやってたの?
2022/05/02(月) 18:06:02.86ID:+FOPwlZG
>>574
文章ミスしたわ。
どちらにしてもややこしいけど。

誤:配列を指すメンバー変数の要素も
正:配列を指すメンバー変数の配列の要素も
2022/05/02(月) 18:23:20.44ID:WQmMvuhJ
>>570
構造体の中の配列の各要素は当然構造体の一部
つまりメンバ
というのが私の認識だが
その結果はどうでも良い
ここを議論しても意味がない
単なる言葉の定義の話だから

そうじゃなくて
技術的な話をしたいわけで

以下なら&S::a1と出来る
これで実質&S::a[1]になる

struct S {
...
union {
int a[3];
struct {
int a0;
int a1;
int a2;
};
};
};

こんな事をやらないと出来ないのはなぜか?
2022/05/02(月) 18:27:19.33ID:WQmMvuhJ
>>571
>>576
2022/05/02(月) 18:34:51.86ID:dhIldcoi
>>576
これは抽象の問題だから言葉の定義こそが本題だよ。
2022/05/02(月) 18:40:58.17ID:HZ9CcBZq
おじいさんみたいな改行と文体
2022/05/02(月) 18:45:56.08ID:JwCZPFEF
>>578
>576は抽象の問題は話していないので、そういうことにはならないかと。
言葉の定義が重要というならまず「メンバポインタ」などという未定義の用語を使うべきではないでしょうし。

なお>574の「配列を指す変数がポインタと同一視される」といった不正確な理解も、
厳密な定義を語るにあたっては前提が不適切と思います。

>576 などでは現行の pointer to data member を拡張した "pointer to subobject" とでも言うようなものの
可能性が探られているものと理解しています。
現状でそういった機能が無い理由は >561 になると思ってますが。
2022/05/02(月) 18:53:30.65ID:WQmMvuhJ
配列にも入れ子の構造体にも使えない
offsetofの劣化コピーじゃ
何のためにわざわざ仕様追加したんだかわからんねえ
2022/05/02(月) 19:03:28.83ID:JwCZPFEF
>>581
追加された理由は offsetof に伴う危険なキャスト無しで同等の機能を提供したかったからでしょうね。
そもそもCでさえ offsetof を使ったメンバアクセスはすべて規格上は未定義動作の範疇のままであり、
未定義動作を認めないとする観点で言えば pointer to data member は純粋な拡張として有用です。

現行コンパイラ実装での挙動まで含めて考えれば、挙げられているとおり offsetof の適用可能範囲のほうが
ずっと広いんですけども。
583デフォルトの名無しさん
垢版 |
2022/05/02(月) 20:14:09.92ID:pVfL1f+B
ninja使わないで普通にmakeするとものすごく遅いな。
ninjaって凄く速かったんだな。
584デフォルトの名無しさん
垢版 |
2022/05/02(月) 20:49:04.97ID:/YgtvrIl
純粋な疑問なんだけどメンバ変数である配列の要素のポインタを変数として扱えて何が嬉しいの?
使い方が思い浮かばない…
2022/05/02(月) 20:59:32.26ID:dhIldcoi
そもそもメンバを指すポインタだってそんなに使うもんじゃないしな。
std::is_class の実装に使えるんじゃねーのという文脈で登場する程度。
2022/05/03(火) 10:38:15.40ID:J5PtY6cN
ていうか>>512の例ができない理由の説明は>>548で良くね↑
>>542のコードを借りるが
struct STRUCT {
 int* array;
};
int STRUCT::*pt = &STRUCT::array[2];
という最後の行は
>c において配列を指す変数がポインタと同一視されるんだから(>>574)
に依存した便法が混じっているから話がおかしくなるので便法抜きで厳密に書いたら
int (STRUCT::*pt)[] = &STRUCT::array;
であって配列内のオフセットがメンバポインタで表せる余地が無いことは確定的に明らか
2022/05/03(火) 10:41:06.53ID:J5PtY6cN
構造体STRUCTのメンバを指すメンバポインタというものが
構造体STRUCTの直接の配下のメンバ以外まで指せる仕様にしたら
構造体STRUCTの中に構造体SSTTRRUUCCTTが存在する入れ子のケースにおいて
構造体STRUCTのメンバポインタでなんでSTRUCT::SSTTRRUUCCTTのメンバを指せないんじゃヴォケ、
おなじSTRUCTのメンバやろうが、
みたいなお馬鹿疑問を抱くアフォが出てくるに違いないのと同じ
588デフォルトの名無しさん
垢版 |
2022/05/03(火) 12:03:52.41ID:uzYP/aDa
エラーログかとおもた

Amnesty International USA
https://twitter.com/amnestyusa/status/1521295013044539392
Abortion is a human right
Abortion is a human right
Abortion is a human right
Abortion is a human right
Abortion is a human right
Abortion is a human right
Abortion is a human right
Abortion is a human right
Abortion is a human right
Abortion is a human right
https://twitter.com/5chan_nel (5ch newer account)
589デフォルトの名無しさん
垢版 |
2022/05/03(火) 18:51:24.96ID:TQMg8rzt
>>587
最後の止め乙
2022/05/03(火) 22:24:19.43ID:J5PtY6cN
ついでに漏れもお馬鹿質問したいのですが
ファイルスコープの関数をextern "C"する正しいやり方教えてクレメンスorz
目的はatexit()への登録で、登録する関数自体は公開したっくないケース

// (1)
extern "C" void foo(void) { ... } // NG: ファイルスコープにならない

// (2)
extern "C" void foo(void);
static void foo(void) { .. }  // NG(?): コンパイラに怒られそう

// (3)
namespace {
 extern "C" void foo(void) { ... } // NG(?): コンパイラに怒られそう 怒られないとしたら漏れの知っている無名名前空間の実装と違う
}

// (4)
extern "C" {
 static void foo(void) { ... } // NG(?): コンパイラに怒られそう
}
2022/05/03(火) 22:26:06.85ID:J5PtY6cN
やっぱ拡張子を ".c" にしてstatic void foo(void) { ... }するしかなさげ?
2022/05/03(火) 22:39:49.52ID:k6J/qudN
> ファイルスコープの関数をextern "C"する
一行で矛盾しているが
593デフォルトの名無しさん
垢版 |
2022/05/03(火) 22:40:29.61ID:EqZaa2d1
atexitが求めているのは関数ポインタだけなのでextern "C" はそもそも必要ない

extern "C" は関数の内部名をC言語形式(func()→_func)で扱うか、
C++形式で扱うか(func()→_Z3funcv、引数の型によって名前が変わる)だけの違い

namespaceとの相互作用は知らん
2022/05/03(火) 23:03:04.80ID:J5PtY6cN
>>593
た確かに…!
VCだとC++リンケージの関数でも問題無く登録できてイゴイタ
ここの記述に引きずられてしまった↓
https://www.ibm.com/docs/ja/zos/2.2.0?topic=functions-atexit-register-program-termination-function
C および C++ のリンケージ規約は非互換の ため、atexit() は C++ 関数ポインターを受け取ることができない。
C++ 関数ポインターを atexit() へ渡そうとすると、コンパイラーが エラーとしてこれにフラグを付けることになる。
C++ atexit() 関数を使用するには、atexit() に登録されたすべての 関数を extern “C” として宣言することに より、
これらの関数が C リンケージを必ず持つようにしなければならない。
595デフォルトの名無しさん
垢版 |
2022/05/03(火) 23:16:58.67ID:LdVfvoP5
>>594
なんだそれは...IBMコンパイラ特有の制限か?

Linuxでもそんな制限はないし
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/atexit.3.html
596デフォルトの名無しさん
垢版 |
2022/05/04(水) 06:21:09.19ID:TqagpjaD
9.11 Linkage Specification
2 Two function types with different language linkages are distinct types even if they are otherwise identical.
2022/05/04(水) 10:35:59.45ID:GAB8HZoP
2^17179869183って計算できる?
2022/05/04(水) 11:01:15.82ID:vYlyugAJ
俺の脳じゃ無理
2022/05/04(水) 11:12:19.56ID:OOPwcDJ/
>>597
計算できるというのを、どんな手段を使ってでもそれを
例えばメモリ上に何らかの表現として出力する、という意味にするのであれば、余裕で可能かと?
2022/05/04(水) 11:15:08.92ID:GAB8HZoP
>>599
10進にして全桁表示可能だろうかと思って
10進での答えが知りたいわけだ。
2022/05/04(水) 11:16:25.61ID:OOPwcDJ/
>>600
可能だと思うよ
自分は詳しくないけどそういう大きい桁に関するライブラリの書き込みをここでよく見るので
2022/05/04(水) 11:19:13.87ID:OOPwcDJ/
でもその前にどのくらいのメモリが必要そうかの見積もりはざっくりやったほうが良さそうね
2022/05/04(水) 11:20:53.78ID:OOPwcDJ/
ざっくり2GBなのか
なんか現実的ではない気がしてきた
少なくとも家庭用のPCなんかでは無理そうかも
2022/05/04(水) 11:48:39.54ID:GAB8HZoP
>>603
ありがとう。
まだ時間がかかりそうだな。
ちなみに128倍精度浮動小数点数の最大値の計算の途中で出てくる計算。
2022/05/04(水) 14:50:41.22ID:RRH/ygkO
128倍精度ってなんですか(・∀・)?
倍精度で表せる最大値((2^(1023+1)) - epsilon)の2^128倍は
(2^(130944+1)) - epsilon
であって
2^17179869183
よりカナーリ小さげ
2022/05/04(水) 15:26:18.04ID:RRH/ygkO
ゴメス落ち着いて考えたら倍精度で表せる最大値は
 ((2^(1023+1)) - epsilon*(2^1023) = (2^(1023+1)) - (2^970)
で、その128倍の精度だとしたら
 ((2^(130944+1)) - (128倍精度のepsilon)*2^130944) = ((2^(130944+1)) - (2^122771)
ここで
 128倍精度のepsilon = 2^(-8173)
と仮定ェ、
(∵全体が倍精度の128倍=1024 byte = 8192 bitで指数部が8 bit増加で19 bit、符号ビット1 bit
 やったら仮数部は8192-19-1 = 8172 bitで、最上位の1を省略する
 ケチ表現なので実質2^(-8173)が仮数部で表せる最小値すわなち128倍精度のepsilon
2022/05/04(水) 15:36:55.26ID:GAB8HZoP
倍精度浮動小数点数が64ビット浮動小数点数なので、
128倍精度浮動小数点数は4096ビット浮動小数点数。

IEEE754-2008の推奨による仕様での最大値の計算をしていたんです。
2022/05/04(水) 15:38:07.79ID:GAB8HZoP
k bit浮動小数点数
https://irem.univ-reunion.fr/IMG/pdf/ieee-754-2008.pdf#page=25
2022/05/04(水) 15:39:34.72ID:GAB8HZoP
ちなみに128倍精度の最大値は
(2^((2^(35-1))-1))*(2-(2^-4060))
で計算可能かと。
2022/05/04(水) 15:59:04.91ID:GAB8HZoP
倍精度浮動小数点数の場合。

>(2^((2^(11-1))-1))*(2-(2^-52))
=
+ 1797 69313
48623 15708 14527 42373 17043 56798 07056 75258 44996 59891
74768 03157 26078 00285 38760 58955 86327 66878 17154 04589
53514 38246 42343 21326 88946 41827 68467 54670 35375 16986
04991 05765 51282 07624 54900 90389 32894 40758 68508 45513
39423 04583 23690 32229 48165 80855 93321 23348 27479 78262
04144 72316 87381 77180 91929 98812 50404 02618 41248 58368.

309桁の値。

となるので、計算式は合っているはずだが根拠を失念してしまったw
ネットのどこかに書いてあったはず。その式を使っただけ。
128倍精度の場合、35が指数部(符号含む)で4060が仮数部(符号含まない)
611デフォルトの名無しさん
垢版 |
2022/05/04(水) 17:03:38.52ID:TqagpjaD
>>597
2GiBのメモリをゼロクリアしてからMSBを1にするだけ
簡単すぎて話にもならん
2022/05/04(水) 17:27:38.78ID:fooXr7Ib
10進数でデータが欲しいって書いてあるのが見えないかw
2022/05/04(水) 17:31:26.47ID:Dfc3wQ1w
C++でやることにこだわりないならPythonが手っ取り早いぞ
あれのintはデフォルトで多倍長だから

>>> f=open(r"C:\pow2.txt", "w")
>>> print(2**17179869183, file=f)
2022/05/04(水) 17:31:51.73ID:tbM1xmku
10進数でデータの意味が分からんが一桁づつ印字すれば良いだけだろ
2022/05/04(水) 17:32:35.63ID:GAB8HZoP
>>613
ありがとう。
参考になります。
2022/05/04(水) 17:57:22.19ID:GAB8HZoP
スレチだけど
https://paiza.io/projects/
のpython3で
print(2**17179869183)
をやってみたところエラーになった。
print(2**171798)
では答えが出る。
メモリかな?
2022/05/04(水) 19:39:52.57ID:CsYq7Xth
http://codepad.org/ でも print(2**171798) までやね
print(2**1717986) だと time out
print(2**171798691) だと MemoryError
2022/05/05(木) 00:09:45.17ID:u08Uuhhj
下記は一部ですので不完全です、型をソートしています。
index_sequenceで展開が面倒なんですよね、何かうまい方法ありませんか

template
<
 template<typename> class Orderable,
 typename     ListT
>
class SortTypes;

template
<
 template<typename> class Orderable,
 template<typename...> class List,
 typename...     Ts
>
class SortTypes<Orderable,List<Ts...>>
{
 template<typename SeqT> struct Impl;

 template<std::size_t... Is>
 struct Impl<std::index_sequence<Is...>>
 {
  static constexpr std::array<std::size_t,sizeof...(Ts)> indexes =
   []{
     using Ord = std::common_type_t<decltype(Orderable<Ts>::value)...>;
     struct Pair {Ord;std::size_t ndx;};
     Pair arr[] = {{Orderable<Ts>::value,Is}...};
     insert_sort(arr,0,sizeof...(Ts),[](auto x,auto y){
      return x.ord < y.ord;
     });
     return std::array<std::size_t,sizeof...(Ts)>{ arr[Is].ndx...};
    }();
  
  using type = List<std::tuple_element<indexes[Is],TypelList<Ts...>>...>;
   
 };
};
2022/05/05(木) 02:32:03.93ID:FeY8iOM4
フリーランスに立ちはだかる「常駐」の壁。慣例を打ち壊し、
“テレワーク”案件3割→8割へと成長を遂げた「クラウドテック」の軌跡

リモートワーク求人専門サイト「プロリモート」がリニューアルオープン、
業務委託契約の求職者と企業をマッチング

1/3以上が採用につながる高マッチング率、リモートワーク×エンジニア・デザイナー専門の
人材紹介サービス「ReworkerAgent」正式リリース場所からも時間からも自由な働き方を実現!

『ReWorks(リワークス)』リモートワーク特化型転職サイトとして 3月5日 リニューアル

副業・兼業マッチングサービス「クラウドリンクス」登録者数2万人突破
中小企業で進む副業人材の採用、96%が継続採用を希望

茨城県日立市、県外からの「テレワーク移住者」に最大151万円の助成金

長野市、市内に移転・事業所設置し、移住することで最大550万円の支援金を支給

フリーランスが活用できる「最大1,000〜3,000万円・補助率50%〜75%」の
『ものづくり・商業・サービス補助金』とは?概要や条件を解説
2022/05/05(木) 03:10:15.14ID:Hm4Z5Kkb
>>597
やったったが愚直に10で割って下の桁から求めるだと手元のPCでは200年ぐらいかかりそう……
https://ideone.com/6BG7hf

つなみにこれは2^0、2^8、2^64、2^1000には一瞬で正解する
[302] 100.000000 % (38/38) --- 0 sec
2^1000 = 1.071508607186267320948425049060001810561404811705533607443750388 x 10^301
2022/05/05(木) 03:10:34.57ID:Hm4Z5Kkb
10より大きい10^n(100万とか)で割ることにしたら多少は改善するかもしれないが、
最終的に10^nのn桁を10進数表示することを繰り返すことを考えると10で割るトータルの回数に違いが出ないから改善しなさげ……orz

むしろ2進数で計算して10進数にするのではなく最初から10^n進数表現(ただし10^n < UINT32_MAXとか)で2^Nの計算の方を実質10進数でやった方が速そう
計算の手間がO(N^2)なのは変わらないが、割り算無しで済むのは大きいい(多分、
2022/05/05(木) 03:19:38.09ID:Hm4Z5Kkb
2^Nを10^n進数表現(ただし10^n < UINT32_MAXとか)で計算するのはうまくやれば(10^nをUINT_MAXとかよりやや小さめにしたら)
掛け算によるキャリーの伝搬頻度を減らせるから副次的にさらなる高速化の余地が生まれ得る、
2022/05/05(木) 06:04:52.05ID:zLdy+6M7
繰り返し二乗法で大きい素数のmodを計算すれば良いだけ
整数の商がいくらかもすぐ計算できるので、簡単に復元できる
復元した値をメモリに持つかどうかは別の話
はい終わり

これしきのことも分からない奴ら頭ヤバいよ
言語仕様の話ばっかり大好きでアルゴリズムの知識が微塵もないボンクラ
競プロキッズのこと馬鹿にできないね
2022/05/05(木) 06:34:28.46ID:JqRzkj2D
素直に10進多倍長で計算すればいいだけ
今のPCならすぐ
2022/05/05(木) 06:58:12.94ID:ghaa3vLm
>>623-624
すごいね
じゃあ 2^17179869183 の解をここに書いてみて
あとそのプログラムコードも
2022/05/05(木) 08:43:37.74ID:Hm4Z5Kkb
自演ちゃうねん
繰り返し二乗法の適用を思いつかなかったのは太くの至りで宦官の至りやが
2^N計算を10^n進数ベースでやるときに適用して高速化するやり方しか思いつかん
>大きい素数のmodを計算すれば良いだけ
とは何ですか(・∀・)?
2022/05/05(木) 10:32:36.82ID:CLlK/Ylr
興味本位で全桁表示したいだけなら5171655947桁あることを知って諦めてほしい
/と%による単純な基数変換を使うにしても、/も%も桁数Nに対してO(NlogN)程度かかるらしく、それだけかかってようやく1桁求まるレベルなんで、まあ無理よ

概算したいだけなら高校生でも知ってる対数を使う方法で4.637182185+e5171655947くらいと分かる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況