C++相談室 part155

■ このスレッドは過去ログ倉庫に格納されています
2021/03/24(水) 12:07:15.39ID:R+oM8cup
※前スレ
C++相談室 part154
https://mevius.5ch.net/test/read.cgi/tech/1610096040/

テンプレここまで
2021/04/17(土) 08:06:00.96ID:3mxJ/fRx
>>212
特定変数に依存しないbool条件式で起床できるのはWindowsのイベントよりも楽で応用が利く
今さらイベントには戻れない便利さがある
2021/04/17(土) 08:13:31.45ID:nI8O4VG/
>>212
ほんまこれ。せめてspurious無かったらなあ。
めんどいから手っ取り早くspinして待ってまうわ。
2021/04/17(土) 08:49:19.47ID:1dxAtZcl
>>213
その式を書かなくてもいいイベントを使ってからは
condition_variableには戻れなくなった
2021/04/17(土) 10:51:59.94ID:WHLcQryV
おすすめ本ってありますか?
C言語のプログラムを、文法などカンニングしながら書けるレベルです。
2021/04/17(土) 13:30:52.06ID:l53+7OwH
cppreference.comの何が不満かによる
2021/04/17(土) 14:51:21.11ID:ohP60UMx
それだけ読んで理解した奴なんておらんやろ。
219デフォルトの名無しさん
垢版 |
2021/04/17(土) 17:33:14.75ID:3mxJ/fRx
プログラミングにカンニングという概念はない
常にオンラインヘルプなので正確な仕様を確認しながら作業するのがプログラミングの常なので、
カンニング(仕様確認、他人の書いたコードをチラ見してコーディング規約ぶ追従)は仕事の一部
220デフォルトの名無しさん
垢版 |
2021/04/17(土) 17:41:48.19ID:3mxJ/fRx
訂正
プログラミングにカンニングという概念はない
常にオンラインヘルプなどで正確な仕様を確認しながら作業するのがプログラミングの常なので、
カンニング(仕様確認、他人の書いたコードをチラ見してコーディング規約に追従)は仕事の一部
明確なコーディング規約がない場合にはなおのこと、カンニングが重要になる
2021/04/17(土) 18:08:39.80ID:LyWUtAnN
RTTIなんかカンニングだろって個人的に思う
2021/04/17(土) 19:10:13.22ID:3mxJ/fRx
condition_variableに似た関数SleepConditionVariableCS()がWin32APIにも用意されてるけど、直感的で使いやすいのはcondition_variableでしょ
https://docs.microsoft.com/en-us/windows/win32/sync/using-condition-variables
2021/04/18(日) 10:59:46.23ID:lylRPiha
質問なのですが教えてくだちい
Q1. 64 bit符号付整数の積の結果をオーバーフロー無しで(128 bit等で)で得る方法
  ※ 64 bit整数を2^32進数2桁とみなして筆算する処理より速い方法キボン
    SSE4.1可

Q2. (Q1にうまいやり方が無い場合)64 bit符号付整数の積がオーバーフローしたことを検知する方法

Q3. 多倍長整数(例えば8要素のunsigned longの配列として表された符号無し整数0〜2^256-1)
  を10で割る方法orz
2021/04/18(日) 11:05:45.65ID:lylRPiha
Q2は現状a*bの前に std::abs(a) <= std::numeric_limit<int64_t>::max / std::abs(b) という判定をやっているのですが
もっと速いやつ(除算不要のやつ)キボン、
2021/04/18(日) 13:15:25.56ID:aOZ5UqSE
>>223
参考になるかもしれない
https://www.slideshare.net/herumi/webassembly-244797431
2021/04/18(日) 14:35:23.87ID:HGo0FTuj
winならMultiply128、gccやclangなら__int128ってのが使えるみたいだけど
2021/04/18(日) 15:14:50.22ID:regwJJSX
競技プログラミングではよくある質問
2021/04/18(日) 17:15:30.07ID:B2k51TVB
>>223
特定の環境ならアセンブラでやっちゃえば?
ちなみに環境は?

昔その辺の演算は良くやった

Q3は10の逆数を求めておいてかけ算命令でやるのが良いけど
多売長は何進数?

10で割るだけの為にバッファスキャンはもったいない
何かの演算とセットに出来ない?

もしやりたいことが2進多倍長の10進数化なら
もっと良い方法がある
2021/04/18(日) 17:17:36.41ID:B2k51TVB
環境 (CPU, OS)
多倍長の構成 (整数?指数部あり?2進?10進?変則?)
最終的に何がやりたいか

この辺がわかれば色々と教えられる
2021/04/18(日) 17:32:50.11ID:8N2uJcok
>>223
>>225 も多倍長演算ですか、じゃ、私も私の多倍長演算を
https://mevius.5ch.net/test/read.cgi/tech/1434079972/37

>Q3. 多倍長整数を10で割る方法
であれば上のリンク先の line:383 から、std::ostream &operator<<(std::ostream &stream, mpz_base_class c) にて、ちょこっと工夫したつもりです、剰余は下位から確定する点では普通、ですので順序を逆にするのはアレかもしれませんが
2021/04/18(日) 18:08:23.13ID:lylRPiha
とりあえず筆算のやつをゴリゴリ書いてや
った
https://ideone.com/pcltLW
2021/04/18(日) 18:32:04.62ID:2o2Y05bZ
多倍長÷32bitを除算命令を用いてやるのはアホ
2021/04/18(日) 18:34:03.31ID:lylRPiha
>>232
kwsk
2021/04/18(日) 19:14:51.87ID:2o2Y05bZ
ヒント
除算は遅い
除算は逆数の乗算
定数の除算のコンパイル結果
2021/04/18(日) 21:49:11.94ID:lylRPiha
(聞くんじゃなかった…
2021/04/18(日) 22:02:51.07ID:lylRPiha
ちゅか10で割るのは10の剰余を知りたいからなのだというのは
言ってなかったわサーセン、orz
多倍長整数の10進数表現を得るために、多倍長整数を10で割って剰余を求める必要があった
この目的には誤差の見積や処置が面倒な方法はNGでありかつ
10進数化とかどうせ表示の時しか使わないのでこの割り算自体はそうメチャクチャチューニングする必要は
ありませぬ(と後出し
2021/04/18(日) 22:16:10.35ID:lylRPiha
もしガチで全く除算を使わずに10進数に変換せよと言われたら
5*10^n、2*10^n、1*10^nを作ってnがデカい順に元の数と比較して引いていく、
ぐらいしかなさげ
知らんけど
2021/04/19(月) 00:09:37.42ID:cH3u5yp0
>>223
トンチンカンなこと聞いてたらすみませんが、Q1って多倍長整数を文字列で持ってカラツバ法とか高速フーリエ変換で計算するやり方だと「遅い」んですか?
2021/04/19(月) 00:24:31.83ID:6sLSrXGT
>>236
であれば >>230

まあ多倍長演算を実装するのならアセンブラが最適で、なんといってもキャリーフラグやゼロフラグを触れるのはアセンブラしかないですからね
というか、C/C++ だけで多倍長を実装するなんて馬鹿なことを思いつくのは私くらいですかね‥‥
2021/04/19(月) 00:29:31.32ID:6sLSrXGT
>>238
>カラツバ法とか高速フーリエ変換で計算するやり方だと「遅い」んですか?

これらは、オーダーは O(n^2) より下のクラスなので速いのはそのとおりですが、しかし使えるのは掛け算のときだけですね
まあ逆数を掛けるという意味では割り算も OK かもしれません、そして逆数計算は「単桁 vs 多桁」だから、オーダーは無視できますし

それはそうと、昔バグっていた例のペンティアムの除算アルゴリズムを解説してくれるサイトはないですかね‥‥
2021/04/19(月) 00:31:27.00ID:6sLSrXGT
>>236
いいわすれましたが、商が高速に求められれば、剰余は 被除数−商×除数、で求めるものですし、多分高速除算・高速剰余計算は多分そうしているでしょうね
2021/04/19(月) 00:33:03.64ID:cH3u5yp0
>>240
質問者は掛け算と10で割る (小数点以下は無視する割り算ですよね?) しか聞いてないので、掛け算さえできれば良くないですか?
2021/04/19(月) 00:37:49.63ID:cH3u5yp0
ああ、10で割るのはあまりを求めたいからって書いてあった
でも10で割った余りって1の位の数字ですよね?
そんな話じゃない?
2021/04/19(月) 00:39:51.82ID:cH3u5yp0
まあいいや
チューニングする必要はないって話なんで、わり算の話は置いといて、結局やりたいのは整数同士の掛け算ですよね?
2021/04/19(月) 00:45:58.97ID:r2ULphPG
質問者が情報を後出ししたりしていてイマイチ信用に欠けるので、普通の整数のように何でもできる多倍長整数がほしいのか掛け算さえできればOKなのかは不明
2021/04/19(月) 00:46:33.44ID:6sLSrXGT
>>243
そんな話です
でも2進10進変換をやりたいのなら、基本的に 10 で割った剰余を求める以外に手はありませんね
2021/04/19(月) 00:49:32.73ID:cH3u5yp0
>>246
では、最初から10進数を文字列で持てば2進10進変換をする必要がない、というのが僕の立場の回答になりますね
やりたいことが掛け算だけなら、という条件が付きますが……
2021/04/19(月) 01:17:33.43ID:6sLSrXGT
>>247
最初から10進で数値を持つと、加減算ですら速度が低下します
10進化の頻度は各種演算の頻度よりも少ない、というか、演算を何千回・何万回した最後に 10 進に変換する、かもしれない、っていう状況で、最初から 10 進で持つのは無駄以外の何ものでもないかと

それに32bit までは BCD 補正命令がありましたが 64 bit の今は BCD 補正命令(AAA とかね)ですら削除されちゃっていますし
2021/04/19(月) 02:16:04.24ID:hAOdtYDs
>>248
質問者は加減算はするんですか?
2021/04/19(月) 02:16:30.94ID:hAOdtYDs
ID変わってますが同じ人です
2021/04/19(月) 06:59:05.63ID:6wuAqTFP
一応私
東大大型計算機センター時代に円周率ギネスに関わったこともあって
多倍長の知識や技術は確実にこのスレで一番だと思うのだけど
スルーするなら消えるね
2021/04/19(月) 07:39:37.59ID:MiZJ3RJg
だって多倍長「整数」、と最初に断ってあるのに小数や指数表示の話を始めそうなふいんきだったし、
Q1、Q2に関しては64 bit同士の積の話なので
今日日のなんちゃら漸化式を使う円周率計算とかに使う
多倍長の掛け算みたいな別次元テクニックは明らかに使いどころが無いいいし……
2021/04/19(月) 07:53:01.92ID:MiZJ3RJg
>>249
する
ただしQ1とQ2の質問の直接の範囲ではありません
しかし、とはいいつつ筆算のアルゴリズムで実装したら必要になったので
とりいそぎ加減算を実装してみた(>>231

Q3は多倍長整数を32 bit整数で割るやり方をガチで忘れたので質問したorz
のですが途中で思い出し実装した、というろくでもない経緯ですたサーセン、
>>235はついカッとなって書いた>>234の人はスマンカッタorz

今後の方向性としてはコンパイラはVCを使っているのでSSE4.1のイントリンシックを使って
お手軽に64 bitデータの積和を128 bit幅で計算する方向なキモス

>>239
>キャリーフラグやゼロフラグを触れるのはアセンブラしかないですからね
それは思わないでもないが積をやりだすと上位桁への伝搬が1 bitでは済まないので
C/C++ だけで多倍長を実装するのは結果オーライかと、
2021/04/19(月) 08:16:03.30ID:6wuAqTFP
その>>234だけど
まあ素人同士で頑張って
2021/04/19(月) 08:27:12.50ID:6wuAqTFP
2進多倍長の10進化にQ3を使うのはアホ

これだけは書いておいてあげる
2021/04/19(月) 08:36:36.63ID:wJLYJwE7
122=235か。
お前もう質問するなよ
2021/04/19(月) 08:47:34.79ID:cH3u5yp0
>>253
多倍長がどれほど多倍長かというのにもよりますが、とにかく速いQ1の回答はカラツバ法とか整数環上でFFTして畳み込みだと思います
Q3はそもそも多倍長整数をどう持つかによるので、仕様を確定しないと難しいんじゃないでしょうか
2021/04/19(月) 08:51:43.03ID:cH3u5yp0
あ、64ビットにおさまるくらいの桁数の話なんですね
だったらパースとかするオーバーヘッドが大きそうなので、僕の言った方法は有効じゃなさそうです
失礼しました
2021/04/19(月) 08:55:57.38ID:RwTjYqyx
肩書きとかキャリアを己の発言の信憑性の根拠にするって、お前ここはニュー速VIPじゃないんだぞ
2021/04/19(月) 12:17:34.06ID:zMLTVIrM
多分勘違いしてる人がいるかと思うので一応書いておくと
>>251>>257 (cH3u..)は別人です
2021/04/19(月) 12:25:33.89ID:RwTjYqyx
いやクソどうでも良いんだが
捨て台詞 (>>254) 吐いて退場したけど勘違いされてたら悪いと思って戻ってきたの?
2021/04/19(月) 12:34:37.87ID:zMLTVIrM
>>257がバカ発言してて
同じ人と思われたらイヤだなあと思って
2021/04/19(月) 12:54:00.52ID:hAOdtYDs
>>262
長い多倍長整数の掛け算で数論変換して畳み込むより速いやり方ってあるんですか?
64ビットに収まる話なのに数論変換なんて持ち出すのがバカってことですか?
2021/04/19(月) 13:17:17.86ID:zh6rCSPG
こんなところで身バレしそうな職歴晒してまでどうしたいんだろう
時々いる煽り耐性ゼロの人かな
2021/04/19(月) 13:36:43.08ID:dtIEXEiV
いやフツーに嘘でしょ
精々が
・学生のときにデカいプロジェクトに名前だけ入ってた
・技官がイキってる
・隣の研究室にいた
くらいじゃない

> 東大大型計算機センター時代に円周率ギネスに関わったこともあって
「関わった」という控えめで奥ゆかしい言い方を思えば、PIとかそのクラスではないことは明らか
2021/04/19(月) 16:48:40.50ID:mIgsEenU
盛り上がってるところすいません
マルチスレッドで1バイトの変数に対してatomicな操作をしたいのですが
ロックフリーで行いたい場合
ATOMIC_CHAR_LOCK_FREEの値が2以外の場合は保証されないのでしょうか?
2021/04/19(月) 17:02:33.15ID:ssZtrIut
>>266
1バイトの変数がatomicに読み書きできない環境?
断言するが、そんな環境でお前のプログラムはどうせまともに動くわけないんだから気にしなくていい
2021/04/19(月) 17:22:54.26ID:utLkXQPz
規格的にはそうですとしか言えんわな
現実的にはともかく
2021/04/19(月) 17:30:46.64ID:mIgsEenU
>>267
いやだからそれを聞いてるんです
手元のマシンではできるのは当たり前じゃないですか
そう言うケースがあるのかそれはどう言う場合か?を聞いてるのです
2021/04/19(月) 18:10:02.15ID:6wuAqTFP
>>263
特別サービス

>>238
64bit同士の乗算でカラツバやFFTなんかやらん

>>247
文字列で保持?バカ?

>>248
2進、10進どっちもある
実際ギネスの記録もどっちも使ってる

まあ質問者の内容からすると
そのうちカラツバやFFTが役立つ時がくるかも知れないけど
今の段階だと豚に真珠
役立つ可能性は>>255がヒント
2021/04/19(月) 18:10:29.58ID:6wuAqTFP
>>269
4bit CPU
C++環境は無いかもしれないけど
2021/04/19(月) 18:11:36.17ID:HuLqOw9z
>>269
マルチスレッドが使えない環境かな
2021/04/19(月) 19:29:48.98ID:xQPYHIMj
>>270
結局コイツが出した新しい情報一つもなしw

ついでに言えば
>>270
> 64bit同士の乗算でカラツバやFFTなんかやらん
さえ
>>258
> あ、64ビットにおさまるくらいの桁数の話なんですね
>>263
> 64ビットに収まる話なのに数論変換なんて持ち出すのがバカってことですか?
の後追いっていう

100パー>>265ですわ
2021/04/19(月) 20:10:17.57ID:6wuAqTFP
バカにはわからない
2021/04/20(火) 01:11:18.41ID:lQgqPl99
言語、規格バカはマジでウザい
ちょっとした言い間違いで、配列とポインタについて
30分語られたわ
先輩だから、聞いてやったけど・・・
そいつ、仕事できないなくてハブられてるwww
2021/04/20(火) 04:53:21.68ID:MRJwD2x4
30分しか語れないんじゃそりゃハブられるわ
ポインタだけで1日終わるくらいがスタートラインだろ
2021/04/20(火) 06:53:00.02ID:RELc90o2
C++に関しては知識と開発能力が比例しないということを採用担当者は知っておくべき
2021/04/20(火) 07:17:36.48ID:xhmy6KmQ
C++20が憶えきれない
こんなことは初めてだ
2021/04/20(火) 08:09:40.68ID:Hk0/CBHu
配列とポインタは混同してると危険だから怪しいこと言ってる奴がチームにいたら捕まえて説明するよ
どんな言い間違いか知らんけど心配させるようなこと言う方が悪い
2021/04/20(火) 08:30:33.16ID:ipiVKlKV
こんなとこに同僚の愚痴書いて気晴らししてるやつが仕事できるとは到底思えないな。
2021/04/20(火) 10:14:33.25ID:v3OtCzj2
同僚と先輩の区別もつかない奴はプログラマーには向いてない
282デフォルトの名無しさん
垢版 |
2021/04/20(火) 10:52:16.13ID:9UAiU1Oe
linuxとwindowsで使える共通の開発環境ってなんでしょうか?
guiアプリを作りる場合です

エディタ:vscode
言語:c++
gui:qt

という感じですか?
pythonやelecrtonなんかもありますね
2021/04/20(火) 12:10:41.97ID:VvQCOD1T
>>282
マイナーだけどwxWidgetsを推す
見た目がOSネイティブに近くなるのが好き
2021/04/20(火) 12:18:00.63ID:YUL53Jgh
Karatsuba法を実装できるから実装してみた
https://ideone.com/W1j1o0

Karatsuba法推しの香具師はいっぺん自力で実装してみたらいいかもしんない
かもしんない運転、

言うは易しの好例に思えるorz、、、
2021/04/20(火) 12:18:13.99ID:VIg6RvGl
>>281
辞書くらい持ってるだろ?日本語も勉強しような
2021/04/20(火) 12:36:36.65ID:q1a39yZP
>>285
お前が勉強しろよw
同じ職場の人という意味で同僚とか言ってるだろうけど>>275があえて先輩と書いてる意味もわからんのか?
2021/04/20(火) 12:42:32.22ID:VIg6RvGl
>>286
そこ区別して同僚の愚痴を先輩の愚痴に書き換えたところでなにも変わらんだろアホ
2021/04/20(火) 12:43:21.01ID:X7tfUSAH
技術的な話で太刀打ちできなさそうだと枝葉末節で揚げ足取りが始まる掲示板はどこでしょう?
そう、ここです!
2021/04/20(火) 12:43:25.81ID:foxJ/HUw
>>284
測定してみればわかるけど
カラツバの守備範囲は非常に狭い
2021/04/20(火) 13:00:09.50ID:xhmy6KmQ
>>279
御意

俺も文字列リテラルはポインタって言ってる先輩がいてバトルになったことがある
2021/04/20(火) 13:46:48.72ID:NNyYGUS8
>>287
マジで日本語の理解力がないんだな…
>>275はパイセンより理解してる俺スゲーって言いたいんだよ
まあ底辺同士の争いでしかないけどw
292デフォルトの名無しさん
垢版 |
2021/04/20(火) 13:47:04.64ID:9UAiU1Oe
>>283
wxpythonというのがありましたね。
qt+c++の組合せよりも簡単ってことでしょうか?
293デフォルトの名無しさん
垢版 |
2021/04/20(火) 14:16:30.60ID:fd+AEuq4
C++11以降はそれ以前のC++とまるで別の言語のような感さえある。
だが基本中の基本である文字列操作がJavaやPythonほど簡単になってないのが残念。
2021/04/20(火) 15:06:35.17ID:VvQCOD1T
>>292
pythonでは使ったことないのでわからん
つかここはC++スレなので、言語関係なくGUIツールキットについて聞くのはスレ違いかと
295デフォルトの名無しさん
垢版 |
2021/04/20(火) 15:35:17.43ID:9UAiU1Oe
linuxでopenglやりたいので、c++かなと。
2021/04/20(火) 20:37:50.18ID:Pk69v7H3
>>284

カラツバの計算量が桁数の何乗かは忘れたが、ちゃんとスケールした?
あと当然FFTの方が早いよ
2021/04/20(火) 20:42:34.03ID:NN6yC6GV
しったか乙
2021/04/20(火) 20:55:33.24ID:Pk69v7H3
まあどの道64ビットに収まる桁数だったら意味ないってことは上で結論出てるけどな
2021/04/20(火) 21:01:48.70ID:YUL53Jgh
掲示したソースコードにおける
最適化に対するメモリエリアシングの影響について:
2021/04/20(火) 21:25:08.48ID:odq3qVNb
クラスに特定のoperatorが定義されているか調べるために、
以下のようなtemplateを作ってMSVCでもclangでも一応期待通りに動いてはいるんだが、
VS2019のintelliSenseの解析が異常終了するらしく機能しなくなるんだよね、VS2017は大丈夫なんだけども
何か変かな?

template < typename OPERATOR, typename T > class has_operator
{
private:
template < typename U > static auto check(U x) -> decltype(x.operator OPERATOR(), std::true_type());
static std::false_type check(...);
public:
static bool const value = decltype(check(std::declval<T>()))::value;
};
2021/04/20(火) 22:16:09.71ID:VR7Rz1W7
>>284
>Karatsuba法推しの香具師はいっぺん自力で実装してみたらいいかもしんない

わたしも、やろう、やろう、とおもってても最後は「この野郎」になってしまうのです
カラツバ、今の私には強敵です…
2021/04/20(火) 22:33:18.23ID:nuXnJUWD
桁数nとしてカラツバはおよそnの1.6乗でFFTならnlognなのになぜか皆カラツバの方をチョイスしててワロ
文系の皆さんにはフーリエ変換なんて難し過ぎるか
2021/04/20(火) 22:35:49.17ID:nuXnJUWD
FFTの方は奥村のCアルゴリズム本に載ってるからアクセスしやすいけどね
カラツバはクヌース本くらいしか知らん
2021/04/20(火) 23:13:53.90ID:VR7Rz1W7
>>302
だって DFT とか概念すらわからないし
高卒には無理です‥‥

カラツバだったら意味ならなんとかわかります
2021/04/21(水) 06:19:59.72ID:Y7fj3JnX
QZは高卒だったのか
2021/04/21(水) 09:14:33.98ID:d8/E1L9C
こちらでどうぞ
https://medaka.5ch.net/test/read.cgi/prog/1545457659/
2021/04/21(水) 10:43:52.09ID:NcgxI3iC
高卒・・・そんなんで偉そうに留数定理とかのたまってたのか
2021/04/21(水) 10:46:51.63ID:T8R/7AcW
複素数に関するアレコレが指導要領に入ってた頃の高卒だと思うと逆に悲しいな笑
2021/04/21(水) 10:52:21.72ID:NcgxI3iC
いや高校では複素解析やらんだろ・・
2021/04/21(水) 10:55:55.53ID:d8/E1L9C
誘導してんだからあっち行けよ
2021/04/21(水) 11:11:39.04ID:DSKXDkbA
>>309
大昔あって今また復活したみたいな流れじゃなかった?
留数定理を必ず習った/習うかどうかは知らんが
2021/04/21(水) 11:15:29.03ID:bCpwaxws
>>311
ないはず
調べてみたけど
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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