1 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 10:57:31.60 ID:JaaB5Egp.net] 前スレ C++相談室 part156 https://mevius.5ch.net/test/read.cgi/tech/1621389313/
408 名前:leapi/ [] [ここ壊れてます]
409 名前:デフォルトの名無しさん mailto:sage [2021/09/19(日) 17:59:29.70 ID:UeoKc9fZ.net] 時刻取得でそのまま精度を上げるAPIとしては GetSystemTimePreciseAsFileTime https://docs.microsoft.com/ja-jp/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtimepreciseasfiletime ただしWindows 8以降。それ以前だと以下を使うしかないっぽいね。 GetSystemTimeAsFileTime std::system_time::nowの実装としては、_Xtime_get_ticksを使用している(2021年9月21日17:57JST現在) https://github.com/microsoft/STL/blob/main/stl/inc/chrono#L663-L665 これが使用しているAPIについて聞いたStackoverflowの質問 https://stackoverflow.com/questions/54933940/what-clock-does-the-visual-studio-2017-crt-implementation-of-stdchronosystem 上記によると最初に書いたAPIである模様
410 名前:デフォルトの名無しさん mailto:sage [2021/09/19(日) 19:46:00.85 ID:neurUQ4a.net] >>393 GetLocalTime()の精度が10 ms台だというのは Windowsのデフォルトのスレッドへの最大ディスパッチ時間15.6 ms(PCによっては10 ms)の影響が混入している可能性、 >>392 のリンク先のような計測方法をとった場合、計測中に他のスレッドに実行権を横取りされたりすると、どうしても 期待する時間に対して15.6 msとか(高優先のスレッドが相次いでディスパッチされた場合はあるいはもっと)実際の時間が大きくなる 一方>>375 の計測方法は時間の順序にのみ注目しており、プリエンプションの影響を受けない(はずだった この話に猜疑があるなら後で述べる >>392 >>392 の情報提供はdクスやし実際乗り換えようかと考えているが、それはそうとして、std::chronoのふるまいを検証しなくて委員会?
411 名前:デフォルトの名無しさん mailto:sage [2021/09/19(日) 20:05:49.20 ID:neurUQ4a.net] というわけでms単位のUNIX timeを得るにあたってstd::chronoとGetFileTimeAsSystemTime()が同じ精度であり互換であることを 直接検証すた、 https://ideone.com/9Opqj9 実行結果(Windows 10) i=---: st1, chrono, st2: ORDER CHECK i= 0: 1632049473157, 1632049473157, 1632049473157: OK. i= 1: 1632049473158, 1632049473158, 1632049473158: OK. i= 2: 1632049473159, 1632049473159, 1632049473159: OK. i= 3: 1632049473159, 1632049473159, 1632049473159: OK. i= 4: 1632049473159, 1632049473159, 1632049473159: OK. i= 5: 1632049473159, 1632049473159, 1632049473159: OK. i= 6: 1632049473159, 1632049473159, 1632049473159: OK. i= 7: 1632049473159, 1632049473159, 1632049473159: OK. i= 8: 1632049473160, 1632049473160, 1632049473160: OK. i= 9: 1632049473160, 1632049473160, 1632049473160: OK. NG times=0/10 問題無くなったやたー
412 名前:デフォルトの名無しさん mailto:sage [2021/09/19(日) 20:13:38.40 ID:neurUQ4a.net] >>393 GetSystemTime()は確かに根本的に精度悪かったスマンカッタorz この結果からすると、ウィンドーズのシステム時間のの実装は、 OSがプリエンプトした際に更新し、ディスパッチ中は値が変わらないというしくみな可能性が大きい ※ 取得時間の間隔が15.6 msの倍数にならないのは、15.6 msというのがあくまで1津のスレッドが ディスパッチされてからプリエンプトされるまでの「最大」時間であって実際は高優先のやつに横取りされたり 自発的に待ちに入ったりで15.6 msより小さい時間で実行権をOSに返すからだと思う
413 名前:デフォルトの名無しさん mailto:sage [2021/09/19(日) 21:46:58.47 ID:UeoKc9fZ.net] 古いWIN32開発者には常識的な話で検証の必要もなく、実際に検証用のプログラムは昔から大量に作られてるからだと思う 取得時間の間隔が15.6 msの倍数にならないのは「主に16ビット Windows との下位互換性のため」 https://docs.microsoft.com/ja-jp/windows/win32/sysinfo/windows-time
414 名前:デフォルトの名無しさん mailto:sage [2021/09/19(日) 22:17:24.32 ID:k8GedCcQ.net] >>400 後半って「Windows時刻」の説明だよね? GetSystemTimeで得られるのは「システム時刻」であって、また別の時刻体系だと読んだけど間違ってる? https://docs.microsoft.com/ja-jp/windows/win32/sysinfo/system-time WinAPIスレに持っていったほうがいいかもな
415 名前:デフォルトの名無しさん mailto:sage [2021/09/19(日) 22:38:35.16 ID:UeoKc9fZ.net] >>401 大元はWindows3.1時代からあったGetTickCountだと思うんだけど、説明的にそこしかなかったから書いた WinAPIスレで聞きたければどうぞ
416 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 00:06:39.19 ID:luBeUSFz.net] 周期15.6 msを下位互換性のために新しいWindowsがエミュレートしているというのはありえない 1スレッドへの最大割り当て時間としての15.6 msはPCによって変わり得るデフォルト値にすぎないし、 hp.vector.co.jp/authors/VA007219/rtc_pic.html だいたい設定でも変わるし、 https://atmarkit.itmedia.co.jp/ait/articles/1410/30/news150_2.html (スレッドのクォンタムタイム) 取得間隔が15.6 msにならない理由は>>399 で説明いしたし
417 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 00:10:20.87 ID:luBeUSFz.net] で、GetTickCount()の分解能かきちり1 msであることはビジーループ的に値をとってみたらワカル 分解能に関して後方互換性も糞もなく昔からそいうブツのはず 多分やけど、ハードウェアのカウンタを読んでるだけやからなあれ
418 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 00:25:55.12 ID:luBeUSFz.net] と思って、 const int N = 10; std::vector<DWORD> vec; DWORD curTmg = GetTickCount(); DWORD prevTmg; while (vec.size() < (size_t)N) { prevTmg = curTmg; curTmg = GetTickCount(); if (prevTmg != curTmg) { vec.push_back(curTmg); } } for (int i = 0; i < N; i++) { (差分vec[i] - vec[i-1]をprint) } というのをやったら、
419 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 00:26:50.20 ID:luBeUSFz.net] vec[0]=1391507593 vec[1]=1391507609 (diff=16) vec[2]=1391507625 (diff=16) vec[3]=1391507640 (diff=15) vec[4]=1391507656 (diff=16) vec[5]=1391507671 (diff=15) vec[6]=1391507687 (diff=16) vec[7]=1391507703 (diff=16) vec[8]=1391507718 (diff=15) vec[9]=1391507734 (diff=16) やったわorz まつがえますたすみません;;; 勉強になるなあ、
420 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 06:12:36.98 ID:DnvAIBnA.net] >>402 自己レスです GetTickCountとGetLocalTimeとGetSystemTimeの分解能調査 https://ideone.com/wKC8DA 1000回値が変わるのにかかった時間をマイクロ秒で計測した(std::chrono::high_resolution_clock::now()で計測) PS C:\> .\ConsoleApplication8.exe 15614998 1003946 1000238 PS C:\> .\ConsoleApplication8.exe 15621414 1001066 1001218 PS C:\> 結論: GetLocalTimeは約1秒なのでこの環境(Win10+ハード)では1ms程度の分解能がある 感想: 誤差大きい
421 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 07:46:32.11 ID:Pqsh6MJQ.net] ここはWindowsAPIスレになったのか
422 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 07:51:13.46 ID:l/aXhlvm.net] スレタイも読めない、検索できないやつがまともなプログラム書けるはずもなく・・・
423 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 07:52:13.05 ID:Mm5TpRqo.net] windows API使いたがるひとがいてめんどくさい こっちはなるべく標準のc++使いたいのに
424 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 08:19:53.25 ID:VgAULHWI.net] POSIXと比べるとクソ過ぎて話にならんよな
425 名前:デフォルトの名無しさん [2021/09/20(月) 10:01:57.22 ID:LqQpPYvk.net] プラットフォーム固有の話も参考になる 今回の流れは Win32 API と std::chrono の違いが端緒だしスレ違いというほどではない
426 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 10:48:50.60 ID:T+6xg0LJ.net] そのクソがなんで一番利用者多いのか考えてみろ
427 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 11:24:41.17 ID:VgAULHWI.net] バカに合わせてるからだろ 言わせんなよ恥ずかしい
428 名前:ハノン mailto:sage [2021/09/20(月) 11:26:09.83 ID:+hQanlE4.net] 私馬鹿よねーお馬鹿さんよねー今日も win32api
429 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 11:30:28.88 ID:DnvAIBnA.net]
430 名前:とりあえず動かないから面白くないということなのかもなということで、Linuxのclock_gettimeにも対応しといた。 BSDとmac組は知らん。 https://ideone.com/Z9CfOo 一応WIN32はあえて低解像度のを計測してるという点だけは補足しておきます。 [] [ここ壊れてます]
431 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 12:15:53.36 ID:rmuhdvcF.net] timeBeginPeriod 木屋さん元気かな
432 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 12:28:29.25 ID:26DwFCZj.net] 元の質問見てないけどQPCでええんちゃうの
433 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 12:45:29.78 ID:DnvAIBnA.net] >>417 スレッドのスケジューリングも変化するので注意です。 tickとはそもそもそういうものでしたが。 archive.linux.or.jp/JF/JFdocs/The-Linux-Kernel-20.html >>418 >>395 でそう言ったし、high_resolution_clockで使用されてるのもそれ
434 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 12:51:33.23 ID:VgAULHWI.net] CreateWaitableTimerEx(NULL,NULL,CREATE_WAITABLE_TIMER_HIGH_RESOLUTION,TIMER_ALL_ACCESS)
435 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 13:22:11.61 ID:DnvAIBnA.net] >>420 そのタイマは同期待ち合わせに使用するタイマリソースですね 時間計測用に使うのは勿体ないのでやめましょう また無言でAPIだけ書かれても困ります
436 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 13:58:28.71 ID:VgAULHWI.net] バカか 計測するなら精度高めないと意味ないだろ
437 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 14:31:11.65 ID:LO5PkHvF.net] そもそもパフォーマンスの計測に使うなんて言ってなくない?
438 名前:デフォルトの名無しさん mailto:sage [2021/09/20(月) 16:05:39.48 ID:DnvAIBnA.net] >>422 この例はExついてないけど、こういう使い方をするものなんだよ。 待機可能タイマー オブジェクトの使用 - Win32 apps | Microsoft Docs https://docs.microsoft.com/ja-jp/windows/win32/sync/using-waitable-timer-objects >>423 >>388 で求めているのは正確には時刻取得だね。つまりsystem_clockの話。 俺がしてるのは時間計測なのでsteady_clockの話。 違いは時刻の修正などにより増減するかしないかという特性の違いと、それを実現するHWタイマの分解能/性能の違い。 GetLocalTimeの分解能は文書にも記述がなく、>>393 の指摘だけで事実関係が不明なまま宙に浮いてたので、>>416 などでそれを計測した。 ここでは10〜15.6msの出元であるGetTickCountもついでに計測した。 steady_clockとsystem_clockをどこかで同時に取得して、steady_clockの分解能のまま時刻っぽいものを得るみたいなことも短期的には現実的な精度でできなくはないけど。
439 名前:デフォルトの名無しさん mailto:sage [2021/09/25(土) 05:50:44.21 ID:B+D0wTVh.net] 3種類ぐらいのタイマの時刻が1000回変化するのに要するトータル時間Tを測っているらしいが この計測結果からSYSTEMTIMEの分解能がHWタイマの分解能/性能の違いに起因すると結論づけることはできない 実態は>>375 な計り方でst1: SYSTEMTIME、now: nowtime_point、st2: SYSTEMTIME、の順で立て続けに時間をとると >>388 の通り st1 ≦ now && now ≦ st2 + 1 ms という結果なわけで、この「1 ms(<15.6 ms)というのは本当にハードウェアタイマの分解能なんかい話が違うぞ?!」と詰問されて 答えに窮する>>424 な未来が見える見えまくり
440 名前:デフォルトの名無しさん mailto:sage [2021/09/25(土) 05:55:32.54 ID:B+D0wTVh.net] 実態は>>399 に書いた理由のはずで、 証拠にst1の取得とnowの取得の間にSleep(1000)とか入れたら >>388 の結果はたちどころに st1 ≦ now && now ≦ st2 + 1秒 に早変わりする よってGetSystemTime()で取得するSYSTEMTIMEの分解能はHWタイマの分解能/性能起因ではなく、 GetSystemTime()で取得する時刻がOSのプリエンプションタイミングでのみの更新されるというソフト要因である、 という>>399 に述べた理屈が正解ということでケテーイ 実際にやってはいないが天才なので以上のことはちょっと考えたらワカル
441 名前:デフォルトの名無しさん mailto:sage [2021/09/25(土) 06:02:51.16 ID:B+D0wTVh.net] ごめ、Sleep(1000)を入れたのではOSにプリエンプションの機会を与えてしまうからNG 正しくは GetSystemTime(&st1); 15.6 ms未満のビジーループ <== 訂正 now = system_clock::now(); GetSystemTime(&st2); とすると、 st1 ≦ now && now ≦ st2 + 15.6 ms にnowの精度が劣化する、に訂正 OSのAPIもプリエンプションの機会にならない保証が無いのでビジーループはガチでビジーループで作る必要があり、 面倒なのでやらないがな!
442 名前:デフォルトの名無しさん mailto:sage [2021/09/25(土) 07:18:10.24 ID:B+D0wTVh.net] といいつつAPIに頼らずに10 ms規模のビジーループ(ビジーウェイト)させるのはやや技巧を要すると思ったので漏れが自らやってやった、 https://ideone.com/CjXN4X ※ 計測の実行は要Windows 結果、1 ms、8 ms、16 ms、1秒のどれに変えても>>388 と同じで、 std::chrono::now()の時刻nowに対し、その直後にGetSystemTime()で得た時刻st2が 1 msだけ追い越されることはあっても決して 1 msより大きく追い越されることは無かったorz なぜじゃ闇が深いなこれ、 もちろんGetSystemTime()ではなくGetSystemTimePreciseAsFileTime()を使う(↑のソースコードのPRECISE_AS_FILETIMEマクロ定義を有効化する と>>398 の通りドンピシャな時刻順になる点はビジーウェイトがあっても変わらない。 GetSystemTime()のふるまいが一方的に謎杉
443 名前:デフォルトの名無しさん mailto:sage [2021/09/25(土) 08:12:02.95 ID:HzR9ZlyY.net] WinAPIスレに持っていってくれますか? 結局<chrono>に固有の問題(?)ではなくて背後のAPI関数に関することって分かったはずなんで
444 名前:デフォルトの名無しさん mailto:sage [2021/09/25(土) 08:44:57.34 ID:HzR9ZlyY.net] とか言いつつ自分で探してきたので貼っちゃう…… GetSystemTimeの分解能が15.6msというのはXPまでの話らしい https://www.thedelphigeek.com/2007/10/calculating-accurate.html
445 名前:デフォルトの名無しさん mailto:sage [2021/09/25(土) 09:20:27.88 ID:ZWKkb85T.net] >>425 HWタイマの分解能/性能の違いと言ってるのはsystem_clockとsteady_clockの違いの話でWindows APIの話はしてないよ。 一応補足しておくとepochも違う(時刻としてそのまま使えるのはsystem_clockということ)。 >>426 以降は妄想が迷走してるだけに見えるかな。 >>430 は新しい事実で>>393 の謎も解けたしもう俺的に不思議な部分はない。
446 名前:デフォルトの名無しさん mailto:sage [2021/09/25(土) 17:45:16.21 ID:+JZgAVsh.net] > プリエンプションの機会 機会を与えないことができるのは昔のWindowsだろ
447 名前:デフォルトの名無しさん mailto:sage [2021/09/25(土) 18:35:43.94 ID:8CcFj4Yb.net] 今だって邪魔できるよ 消極的ではあるけど
448 名前:デフォルトの名無しさん mailto:sage [2021/09/25(土) 18:44:00.64 ID:+JZgAVsh.net] 割り込み禁止命令が実行できたり 割り込みコントローラにコマンド出せたりする デバドラかMODESETみたいのないと無理だよ
449 名前:デフォルトの名無しさん mailto:sage [2021/09/26(日) 12:46:15.93 ID:9lvhFgGq.net] std::complex<double> の変数 a, b について、OpenMP の並列リージョン内での #pragma omp atomic a += b; が error: invalid expression type for '#pragma omp atomic' というエラーを出すんですが、std::complex はアトミック演算の対象外ですか? それとも他の何かを見落としてる可能性がある?
450 名前:デフォルトの名無しさん mailto:sage [2021/09/26(日) 13:03:13.46 ID:4UIlewCz.net] ompのAPI仕様書を読むと対象はスカラー型のみって書いてあるから対象外なんじゃないの?
451 名前:デフォルトの名無しさん mailto:sage [2021/09/26(日) 13:04:21.25 ID:4UIlewCz.net] ここのx and vってとこ https://www.openmp.org/spec-html/5.0/openmpsu95.html
452 名前:デフォルトの名無しさん mailto:sage [2021/09/26(日) 13:07:22.68 ID:9lvhFgGq.net] 数学とか物理の用語としては複素数はスカラーですが、コンピューター用語としては違うんでしたっけ?
453 名前:デフォルトの名無しさん mailto:sage [2021/09/26(日) 13:18:19.13 ID:loHIOGgF.net] 確かモルダーを疲れさせる女のこと
454 名前:デフォルトの名無しさん mailto:sage [2021/09/26(日) 13:28:55.11 ID:pztAGZv/.net] 対象外 ぷりみ恥部とPOD以外だめ
455 名前:デフォルトの名無しさん mailto:sage [2021/09/26(日) 14:59:44.58 ID:4UIlewCz.net] >>438 std::complexはclass型だよ。c++では
456 名前:デフォルトの名無しさん mailto:sage [2021/09/26(日) 15:02:24.84 ID:9lvhFgGq.net] >>441 つまりatomicはプリミティブ型だけ想定してるってことですかね ありがとうございます おとなしくクリティカルセクションにします
457 名前:はちみつ餃子 mailto:sage [2021/09/27(月) 00:54:20.59 ID:vtQXnC4F.net] >>438 C++ におけるスカラ型の定義 ・ 算術型 (整数型と浮動小数点数型) ・ 列挙型 ・ ポインタ型 ・ メンバへのポインタ型 ・ std::nullptr_t ・ 以上を cv 修飾 (const や volatile で修飾) したもの https://timsong-cpp.github.io/cppwp/n3337/basic.types#9 言語によって定義は異なっている (または定義を持たない) ので コンピューター用語として一般化は出来ないと思う。
458 名前:デフォルトの名無しさん mailto:sage [2021/09/27(月) 06:07:00.04 ID:vzE92GBt.net] ここはC++スレだからC++用語で必要充分だ 無理に一般化する必要はない
459 名前:デフォルトの名無しさん mailto:sage [2021/09/27(月) 08:56:19.98 ID:P6ytpwfT.net] 複素数が「算術型」じゃないのって冷静に考えるの結構奇妙だな
460 名前:デフォルトの名無しさん mailto:sage [2021/09/27(月) 19:18:30.57 ID:LR1S7vXs.net] 複素数を直接扱う命令がないCPUが多い以上、小数2個で表される複素数がスカラではないのは自然だと思うけど それを言い出すと、一般線形群と呼ばれる行列はなんでも算術型になるのではないか?と思えてくるし
461 名前:デフォルトの名無しさん mailto:sage [2021/09/27(月) 19:25:38.25 ID:n9hc+rIL.net] arithmeticを「算術」とか仰々しく訳すからおかしくなる 要は小学生がさんすうで習うような単純な数のことよ
462 名前:デフォルトの名無しさん mailto:sage [2021/09/27(月) 22:16:24.75 ID:D7AKGDxr.net] そもそも数学でも複素数はスカラじゃないよな
463 名前:デフォルトの名無しさん mailto:sage [2021/09/27(月) 22:19:03.53 ID:sGjfmd1K.net] ベクトルの係数になるんだから基本的にスカラじゃねえの
464 名前:デフォルトの名無しさん mailto:sage [2021/09/27(月) 22:43:23.51 ID:PI7czi9F.net] スカラーだったりベクトルだったりするらしい izumi-math.jp/K_Manabe/what_v/what_v_3.htm
465 名前:デフォルトの名無しさん mailto:sage [2021/09/27(月) 22:51:45.61 ID:GPisoDJi.net] 複素ベクトル空間の係数体の元として見ればスカラだし複素数体を実ベクトル空間と見れば複素数は実ベクトル
466 名前:デフォルトの名無しさん mailto:sage [2021/09/28(火) 07:58:37.24 ID:ZoUlFxaV.net] 除算が定義できる体なので普通はスカラーとして扱うと思うけどな。 2要素の実ベクトルや2自由度の行列に適切な演算を導入することによって同一視することはできる。
467 名前:デフォルトの名無しさん [2021/09/29(水) 10:21:13.97 ID:QYKzykPR.net] >>447 要は小学生がさんすうで習うような単純な数のことを「算術」と言うんだが
468 名前:ハノン mailto:sage [2021/09/29(水) 18:51:49.92 ID:+NS+8RdU.net] >>452 >2自由度の行列に適切な演算を導入 有名な a b -b a 以外にも複素数と同様に振舞う行列を定義できるものでしょうか?それはどんな形?
469 名前:デフォルトの名無しさん mailto:sage [2021/09/29(水) 19:37:07.20 ID:F6bYTA4Q.net] 好きなX^2=-Iを満たす行列Xを用意すればaI+bXが複素数の表現になるよ
470 名前:デフォルトの名無しさん mailto:sage [2021/09/30(木) 04:33:42.15 ID:a96KQdEj.net] >>454 > 有名な a b -b a 以外にも > 複素数と同様に振舞う行列 この世のことを何一つとして理解してないことがよく
471 名前:伝わってくる2フレーズ [] [ここ壊れてます]
472 名前:デフォルトの名無しさん [2021/09/30(木) 10:27:42.19 ID:rsDh5L5E.net] i 0 0 i
473 名前:デフォルトの名無しさん mailto:sage [2021/09/30(木) 12:07:05.65 ID:CrfxKotF.net] 複素数z=x+iy (x, y:実数)とした場合どうやって行列で表現できるのか分からん そもそも無理だろ
474 名前:デフォルトの名無しさん mailto:sage [2021/09/30(木) 12:15:59.67 ID:LH+TfD4u.net] いい加減スレチだぞお前ら
475 名前:デフォルトの名無しさん mailto:sage [2021/09/30(木) 12:39:55.75 ID:HqpdIwHE.net] 複素数の実行列表現あたりで調べれば出てくるから自分で調べろ。 複素数ライブラリの実装は行列表現だろ。
476 名前:デフォルトの名無しさん mailto:sage [2021/09/30(木) 14:36:41.46 ID:rqtJMe+2.net] 承認欲求が満たされなかったキチガイのハ◯ンが荒らしてるんだな
477 名前:ハノン mailto:sage [2021/09/30(木) 21:06:22.87 ID:SS5VJirH.net] >>460 キーワードありがとうございます! 1, 1, -2, -1 とか 3, 2, -5, -3 とか i に対応するものはいろいろあるんですね >>456 生きていてすみません
478 名前:デフォルトの名無しさん mailto:sage [2021/09/30(木) 22:32:11.42 ID:hyVGcxZ+.net] 複素数ライブラリの実装が行列表現な訳ないだろ
479 名前:デフォルトの名無しさん [2021/10/01(金) 04:28:27.07 ID:YSb3+a7i.net] パウリ行列やで
480 名前:デフォルトの名無しさん mailto:sage [2021/10/01(金) 08:55:53.93 ID:wyBR1P+Z.net] それは四元数では
481 名前:デフォルトの名無しさん mailto:sage [2021/10/01(金) 11:45:26.96 ID:o+E+DUKy.net] そもそも勝手な演算❎とかを用意して、それを複素数の演算になるような演算規則にすればいいだけの話 普通のプログラミング言語での実装は2要素ベクトルに対して複素数積となるような演算を*に対応させているんだと思うけどな 行列積が複素数の積と同一視できるような表現行列があるというだけ 群論とか環論とか体論とか入門的にでもやればわかるよ
482 名前:デフォルトの名無しさん mailto:sage [2021/10/02(土) 13:55:46.16 ID:cR/mfYmg.net] ベクトルの要素は座標変換で変わるからスカラーではない
483 名前:デフォルトの名無しさん mailto:sage [2021/10/02(土) 13:59:33.99 ID:cR/mfYmg.net] まつがえたorz 誤: 変わるから 正: 変化すっから
484 名前:デフォルトの名無しさん mailto:sage [2021/10/02(土) 14:34:20.70 ID:7v0dyN4q.net] 物理屋さんか?
485 名前:デフォルトの名無しさん mailto:sage [2021/10/02(土) 14:56:43.55 ID:cR/mfYmg.net] んまーたしかに物理現象は座標変換しても変わらない(同じもの)とみなすのが 物理の先生なのかもしれん スカラーもそん延長線上の概念 しかし観測が系に影響を与えると言い出した時点でいつまで真理でありつづけることやら……
486 名前:デフォルトの名無しさん mailto:sage [2021/10/02(土) 20:42:45.96 ID:xJ5F1jwy.net] >>467 言葉足らずだったかもしれないが、複素数体と数学的にはR2の正規直交基底かつ基底の長さが1のベクトルの成分表示を、適切な演算を入れることによって同一視することができるという話をしているのであって、一般的なベクトル空間の話をしている訳ではない。
487 名前:デフォルトの名無しさん mailto:sage [2021/10/02(土) 21:15:26.25 ID:cR/mfYmg.net] スカラーか否かというのは数をどこに使うかの話であって 数をどう表現するかの話ではないし、
488 名前:デフォルトの名無しさん mailto:sage [2021/10/02(土) 21:16:10.17 ID:cR/mfYmg.net] それはそうとしてR^2と言っただけでは計量が入っていないから(平行移動も糞も無いため)ベクトル空間ではない つまり { ベクトル空間 } ⊂ { R^2 } であってR^2の方がより一般的 R^2上で実数と同じ7つの演算則を満たす演算を形式的に定義することはできるが|i|=1を表すために >正規直交基底かつ基底の長さが1のベクトルの成分表示 が必要になるから複素数体を正確に言い表すにはR^2ではなくてユークリッド空間か何かが要ることになるんじゃないの
489 名前:デフォルトの名無しさん mailto:sage [2021/10/02(土) 22:42:32.17 ID:5uoG6j9g.net] 加法(V × V → V)と係数体による倍演算(K × V → V)が入ってて線型ならベクトル空間だよ, 計量入れたら計量ベクトル空間
490 名前:デフォルトの名無しさん mailto:sage [2021/10/05(火) 17:00:23.30 ID:YgA3J5wy.net] 関数の引数に参照渡しで何も渡さないようにするはどうすればよいですか 自作クラスAがあったとして、それを引数にとる関数 void hoge(int& p1, A& p2) があります。 ただ、p2は、ケースによっては要らない場合もあって、その場合にはどうすればよいですか。 調べてみたらnullptrみたいなのはあったので、 int p1 = 1; hoge(p1, nullptr); と書いてみても、 非constの左辺が何とかとエラーが出て、渡せませんでした。
491 名前:デフォルトの名無しさん mailto:sage [2021/10/05(火) 17:34:05.28 ID:lBT+65cn.net] *nullptr
492 名前:はちみつ餃子 mailto:sage [2021/10/05(火) 17:41:01.80 ID:krkmojOq.net] >>475 参照は何も参照していない状態というのは作れない。 参照で受け取るように書いてあればその参照が無効ということはあり得ないという表明として解釈するのが通例。 (実際にはダングリング参照はあり得るけどそれは単に間違ったプログラムなので気にしない。) 引数として不要なのであればオーバーロードで引数が不要な関数も用意するのが真っ当な方法だけれど、 どうしても無効ということを表す状態を渡したいということであればダミーのオブジェクトを作っておいて それを無効の意味に使うという方法は考えられる。 (不格好だけど……。) #include <iostream> struct A {}; A dummy; void hoge(int& p1, A& p2 = dummy) { if(&dummy == &p2) std::cout << "p2 is dummy" << std::endl; else std::cout << "p2 is not dummy" << std::endl; } int main(void) { int foo = 1; A bar; hoge(foo, bar); hoge(foo); } あるいは std::variant と std::monostate と std::ref を組み合わせれば表現できなくもないかなぁ……。
493 名前:デフォルトの名無しさん mailto:sage [2021/10/05(火) 17:45:03.34 ID:UD2fraRe.net] NullObjectパターンすね
494 名前:デフォルトの名無しさん mailto:sage [2021/10/05(火) 17:48:18.95 ID:lBT+65cn.net] hoge(p1,* static_cast<A*>(nullptr));
495 名前:デフォルトの名無しさん mailto:sage [2021/10/05(火) 17:49:14.63 ID:3jRalumJ.net] >>476 *(A *)nullptr にしないとエラーになるな そいで関数側で&p2==nullptrでnullptrが渡されたかどうかチェックできるね でもこんなの許されてるの?
496 名前:はちみつ餃子 mailto:sage [2021/10/05(火) 17:52:23.11 ID:krkmojOq.net] >>476 >>480 当然だけど (空ポインタを含めて) 無効なポインタをデリファレンスしたらその時点で未定義。
497 名前:デフォルトの名無しさん mailto:sage [2021/10/05(火) 19:00:16.73 ID:lBT+65cn.net] 何いってんだ キチンと動作する ただの参照なんだから未定義じゃないだろ 他の変数に受け渡してるワケでもないし
498 名前:はちみつ餃子 mailto:sage [2021/10/05(火) 19:59:32.04 ID:krkmojOq.net] >>482 実質的な (コンパイルされた後の) 動作として値を取り出す必要がないというのは、 言語仕様上において * の適用を無かったことに出来るわけではない。 (C には単項 * の結果に単項 & を適用した場合に相殺されてどちらも無かったことになる規則があるが……。)
499 名前:デフォルトの名無しさん mailto:sage [2021/10/05(火) 20:26:29.70 ID:SwNxahaG.net] また未定義動作なんか怖くない君か 命知らずなのはいいけどチームプログラミングには関わらないでね本当に迷惑だから
500 名前:デフォルトの名無しさん mailto:sage [2021/10/05(火) 20:32:26.64 ID:7rL/DhC7.net] 1. 参照をやめてポインタにする 2. std::optional<T>を使う(C++17以降) 俺ならこのどっちか
501 名前:デフォルトの名無しさん mailto:sage [2021/10/05(火) 22:18:37.99 ID:bhHmmGon.net] クラスTが自作クラスなら Tにnulを意味するlオブジェクトを定義すれば良い…… >>477 なdummyオブジェクト方式はテンプレートの中で使いにくくなるいはず >>485 なstd::optional<T>案はどうせ余計な記憶を要するのだからT固有のnullを定義するうのとイーブン
502 名前:デフォルトの名無しさん mailto:sage [2021/10/05(火) 22:24:32.10 ID:bhHmmGon.net] もちろんT固有のnull「値」の定義においては オブジェクトの参照 == null値、 はアドレスの一致ではなく値の一致として解釈されねばならな い
503 名前:デフォルトの名無しさん mailto:sage [2021/10/05(火) 22:44:53.78 ID:bhHmmGon.net] さもないと、クラスTのnull値をT_NULLみたいな名前にしたとして、 T arr[] = { T_NULL, T_NULL, T_NULL, T_NULL }; みたいなことができないか らな
504 名前:デフォルトの名無しさん mailto:sage [2021/10/06(水) 00:36:12.25 ID:meWA0K5y.net] >>480 ,482 gcc 11 の -O2 で「&p2==nullptrでnullptrが渡されたかどうかチェック」はできなかった。 https://wandbox.org/permlink/c9QQIkFRPpFHd7rL
505 名前:デフォルトの名無しさん mailto:sage [2021/10/06(水) 00:55:04.49 ID:E9G/hK4q.net] void hoge(int& p1, optional<A>& p2 = nullopt) { // constじゃないのでエラー みたいなことってoptionalで上手いことやる方法ないの? 呼び出し元は int i; A a; hoge(i, a); hoge(i); みたいな感じで 書き換えられるけどhogeから抜けたら消える初期値nulloptのoptional<A>をデフォルト値で渡せるのか知りたい
506 名前:デフォルトの名無しさん mailto:sage [2021/10/06(水) 01:23:25.11 ID:V3EBITWg.net] なにいってんだおめ
507 名前:デフォルトの名無しさん mailto:sage [2021/10/06(水) 01:31:37.67 ID:V3EBITWg.net] nullopt以外が渡されたらそのA&に対して、 nulloptが渡されたらスタックにAを構築したうえでそのA&に対して操作したい、ってこと? それはvoid hoge(int& p1, A& p2 = デフォルト値)でいけるんじゃないかい
508 名前:デフォルトの名無しさん mailto:sage [2021/10/06(水) 01:49:32.28 ID:E9G/hK4q.net] 伝わらないようなので、コード書きました https://wandbox.org/permlink/HyOX0jEBR4glCT01