C++相談室 part160

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2022/04/15(金) 08:39:32.42ID:WMzvufu2
前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1645239402/
717デフォルトの名無しさん
垢版 |
2022/05/07(土) 20:11:08.30ID:ihw8CMAo
(2^2)^35か
2^(2^35)かどっちだ?
C++的には前者だが数学的には後者だな
2022/05/07(土) 20:28:26.23ID:hLdUgsLX
>>717
後者だろ?
俺もそれで組んだ。
2022/05/07(土) 21:33:22.65ID:GCz/eJtw
>>687
/etc/pm/sleep.d
2022/05/08(日) 00:59:03.56ID:fONWhazS
べき乗は右結合というのは宇宙の始まりから決まってゐる
なぜなら、(2^2)^35 = 2^(2*35)であって1重のべきにすぎないから左結合の多重冪は多重である意味が無い
2022/05/08(日) 01:01:37.38ID:fONWhazS
>>717
ここでの演算子^はXORの意味ではないから念のため
722デフォルトの名無しさん
垢版 |
2022/05/08(日) 06:50:42.66ID:RoE3BV2z
2+2+2 = 2*3
2*2*2 = 2^3
2^2^2 = 2↑3
2↑2↑2 = 2↑↑3
723デフォルトの名無しさん
垢版 |
2022/05/08(日) 06:51:37.65ID:RoE3BV2z
途中で送信しちまった
これをtemplateで一般化できるか?
724デフォルトの名無しさん
垢版 |
2022/05/08(日) 07:50:20.51ID:21iaPdPG
ここの定義で実装してみた
https://ja.wikipedia.org/wiki/クヌースの矢印表記#定義

#include <iostream>

template<int level>
struct tower {
template<class T, class U>
constexpr static auto op(T t, U u) {
T ret{1};
for (U i = 0; i < u; i++) ret = tower<level - 1>::op(t, ret);
return ret;
}
};
template<> // pow(t, u);
struct tower<1> {
template<class T, class U>
constexpr static auto op(T t, U u) {
T ret{1};
for (U i = 0; i < u; i++) ret *= t;
return ret;
}
};

int main() {
std::cout << tower<2>::op(uint64_t(3), 3) << std::endl;
}
2022/05/08(日) 08:36:28.64ID:vKAQqA9f
>>722
>2^2^2 = 2↑3

あれ?

>3↑3=3^3(3の3乗)=27です。

とか書いている人もいる。
2022/05/08(日) 08:41:34.72ID:vKAQqA9f
>既に述べた通り、1重のクヌースの矢印は冪乗を表す。また、2重のクヌースの矢印はテトレーションを表す。

{\displaystyle a\uparrow b=a^{b}} a\uparrow b = a^b
{\displaystyle a\uparrow \uparrow b={}^{b}a} a\uparrow\uparrow b = {}^b a

クヌースの矢印の矢印が一個ずつ足りないんじゃない?
2022/05/08(日) 10:21:28.93ID:RTAOPX4V
>>719
それは
> メモリの内容をファイルに丸々ダンプ
したりするための仕組みじゃないだろ
チェックポイントがやりたいんじゃないの
2022/05/08(日) 11:30:55.36ID:vKAQqA9f
>>716
ideoneのpythonなわけだが、
10^10^10^5まで対応していそうだ。
2022/05/08(日) 12:20:02.96ID:sGLUGFq3
>>728
タイムアウトすっぞ
2022/05/08(日) 12:29:28.95ID:ZM5mEHZG
昔C++で少ない文字数で巨大な数を作るってのやったなあ
intは十分大きいとしてint main();の戻り値を競うって感じ
2022/05/08(日) 12:51:18.92ID:riShKp28
>>724
constexpr for
ワロタ
2022/05/08(日) 13:13:57.96ID:sRJ9WYdm
return ~0;で終わりでは?
2022/05/08(日) 13:25:31.24ID:nwquViMM
-1だからあんまり大きくないんじゃね?
2022/05/08(日) 14:25:43.97ID:E3hRzs1K
>>727
??
2022/05/08(日) 14:51:21.54ID:fONWhazS
FFTによる積の多倍長演算完全に理解した!
適当な基数の下で表した例えば4桁の数 (a b c d) と (c d e f) を筆算で計算したとき現れる8個の積和
(例えば最長のやつはaf + be + cd + dc)
というのは、 (a b c d) と (c d e f)をそれぞれ関数波形とみなしたf(n)、g(n)の畳み込み
 h(k) = Σ[k=0..3]f(k)g(3-k) (k=0..7)
に他ならない(f(k)やg(k)の範囲外は0とみなす
ということは、h(k)、f(k)、g(k)それぞれのDFT(この場合は1の8乗根を基底とするやつ)をそれぞれH(k)、F(k)、G(k)として
 H(k) = F(k) * G(k)
となるわけやなのでそうやって求めたH(k)を逆DFTしたらh(k)の値が得られているというしくみ
(このh(k)を基数B内に収まるようにcarry_and_fix()したら最終的な8桁の並びが得られる、
2022/05/08(日) 14:53:42.06ID:fONWhazS
FFTする高速化方法はここ↓見たらワカル(wは1のN乗根なので、w^N = 1とかw^(N/2)=-1とかいうのが式変形の要
https://qiita.com/peria/items/fbdd52768b4659823d88

いまちょっと他の用事で手が離せないので48年以内に累乗根の誤差の影響が無い形で実装してみるわサーセン;;;

そしたら漏れも勝ちや!

何と戦ってるのかは知らんが、
2022/05/08(日) 15:17:10.76ID:fONWhazS
スマン誤記があったorz
畳み込みの式は正しくはこうっす
 h(τ) = Σ[k=0..3]f(k)g(τ-k) (τ=0..7)
2022/05/08(日) 15:59:36.72ID:E3hRzs1K
スペクトラムアナライザーでも作るのか
2022/05/09(月) 00:09:35.20ID:yzB2nwTj
>>732
intのサイズなど、環境に依存する値を返すのはNG

C++のコードによって1個の整数を定義して
その整数の大きさを競う
740デフォルトの名無しさん
垢版 |
2022/05/09(月) 03:52:17.59ID:E3g8JMTZ
「~(1<<31)」 (8文字)が短かくなりそうだがint=4byte+オーバーフローの未定義動作を含むからNGという寸法か

しかし「123456789」もint=4byteが前提になってるしどうやって遊ぶんだ?
「std::numeric_limits<int>::max()」でとりあえずint最大値が帰るが
2022/05/09(月) 04:10:24.01ID:lLEJHk2f
>>740
max()は環境に依存する値だからアウトだろう
算出するならunsignedの0の~を1つ右シフトしてsignedにして返すのはどうだろう?
2022/05/09(月) 07:35:52.38ID:yzB2nwTj
-------- Large numbers using C++ --------
C++ 言語を用いて出来るだけ大きな数を出来るだけ少ない文字数で表現する
int main(); が出来るだけ大きな値を返すようにする
C++ は ISO/IEC 14882:2003 準拠とする
ただし、"int" "float" "double" で表現できる値は十分大きいものとする
事実上無限ビットあると考えて良い
あくまで「十分大きい」であり、大きさを規定した以外は言語仕様通りの動作をする
環境依存の動作、環境依存の値を返すものはNG
上記ルールと ISO/IEC 14882:2003 とで
mainの戻り値が1個の値に定まらないようなものはNG
たとえば、intのサイズに依存した値になるコードはNG
pre-processor 使用禁止
#define, #include などの禁止
コンパイラなどに指定するマクロも禁止
__FILE__ や __LINE__ などの組み込みマクロも使用禁止
ライブラリ関数や外部ファイル定義の関数や変数の使用禁止
pow, quit などの外部関数や変数の使用禁止
実行時間やメモリ使用量は問わない
メモリ解放不要
2022/05/09(月) 07:42:44.70ID:yzB2nwTj
文字数が少ないものだとこんな感じ

25文字
int main(){return 9E999;}

30文字
int main(){return 9<<(9<<99);}

42文字
int A;int main(){return++A-9?9<<main():9;}

60文字
int A,B=9,C=9;int main(){for(;A--?B<<=B:A=B*C--;);return B;}
2022/05/09(月) 07:45:44.83ID:VfSI4PVa
intを返せばいいのかと思ったけどfloatとか無限ビットとか言及しているのが気になるな。
解釈違うのかな?
745デフォルトの名無しさん
垢版 |
2022/05/09(月) 08:53:10.27ID:PsDnm+L1
必要に応じて環境のint型を int4294967296_t とか自由に変えていいわけか
2022/05/09(月) 11:51:27.72ID:90x04ZHv
正解は ~0U>>1 です
2022/05/09(月) 12:29:49.47ID:b/WmNbyW
>>746
> たとえば、intのサイズに依存した値になるコードはNG
2022/05/09(月) 12:36:28.70ID:vv2CegjB
>>747
intのサイズに依存してないじゃん
intが16bitでも32bitでも64bitでも>>746は正解を出す
2022/05/09(月) 12:37:51.56ID:b/WmNbyW
16bit, 32bit, 64bitで違う値を返すからNG
2022/05/09(月) 13:09:06.67ID:uszWTY9x
>>749
それぞれに応じてちゃんと異なる値を返すから>>746が正解っぽい
2022/05/09(月) 13:38:49.81ID:b/WmNbyW
異なる値を返すからNG
何度書いてもNGなものはNG
2022/05/09(月) 13:57:46.67ID:DLFHVgdp
~0U>>1  で int のサイズが同じ環境なのに違う値を返すケースある?
753デフォルトの名無しさん
垢版 |
2022/05/09(月) 14:07:18.41ID:PsDnm+L1
>>750
それぞれに応じて違う値を返すこと自体がNGでしょ

>>751
一応ルール確認
sizeof(int); も環境によって変わるからNG
1<<999; はintが1024bit以上なら環境に依存せず固定値になるからOKてことでいいよね?
2022/05/09(月) 14:16:39.02ID:RDjTqhEj
よくわからないパズルは他所でやれ
2022/05/09(月) 14:20:50.13ID:vBDmnMzm
環境によってintの最大値が違うのに環境依存はまかりならんとかw
なら規格で保証されてる最大値(32767だっけ?)を返すしかなくね?
2022/05/09(月) 14:22:28.17ID:SOqsBrLy
>>753
それはだめです
1<<999は例えばintが32bit環境では0となります
大きな数を返すことができていません
2022/05/09(月) 14:27:15.36ID:DLFHVgdp
>ただし、"int" "float" "double" で表現できる値は十分大きいものとする
>事実上無限ビットあると考えて良い
これと

>たとえば、intのサイズに依存した値になるコードはNG
ここの兼ね合いがどうなってるのか文意が読み取れん

日本語難しい
2022/05/09(月) 14:29:47.27ID:4LSguCbO
intの最大値ならINT_MAX
2022/05/09(月) 14:31:48.86ID:HAgcLczC
>>758
それは7文字もあるから敗北
~0U>>1と6文字で行ける
2022/05/09(月) 17:07:31.36ID:A/IF7G4V
>>753
そういうことです

>>757
「十分大きい場合」に同じ値が返れば良いです
「十分大きい場合」でないならば動作不定でも無限ループでも良いです
2022/05/09(月) 17:17:54.32ID:xCpkKQPu
>>760
現実にありえない環境で同じ値が返ったとしても
現実にある環境で異なる値が返るからダメですよ
2022/05/09(月) 17:54:22.09ID:L9YeT6Da
お題スレでやってろ
2022/05/09(月) 17:56:24.99ID:DvQbmhaz
すぐにオーバーフローしたら大きな数が作れない ==> intは十分大きい

同じ値が返らないと数の定義にならない ==> 同じ値が返る

この2個の条件は必須

多倍長数が扱える言語であれば十分大きいは満たしているわけだけど
2022/05/09(月) 20:08:33.86ID:wCt2CEsw
>>735
証明してから使おうね‥‥
2022/05/10(火) 06:49:00.20ID:ME910CgO
>>735-737
FFTでやってる限り誤差で単精度くらいまで落ちるよ
1の乗根じゃなくて整数環でやるべき

あとNGしたいからコテつけてください
766デフォルトの名無しさん
垢版 |
2022/05/10(火) 07:07:25.40ID:/5WHE8tG
>>759
それintじゃなくunsigned intじゃん
(int)(~0u>>1)は13文字だぞ
2022/05/10(火) 07:35:35.52ID:6pIq5VRX
>>765
>>597よろしく
2022/05/10(火) 09:46:20.51ID:MIazK+gu
>>766
それは不要
intを返す関数で使われるとあるから自動的にキャストされる
2022/05/10(火) 12:27:13.81ID:KbKCNa1k
>>766
2^[ビット数-1]-1を作る為だけに6文字も使うのは
巨大数生成としては効率が悪すぎる
770デフォルトの名無しさん
垢版 |
2022/05/10(火) 12:40:40.45ID:/5WHE8tG
>>768
758にアンカーがないのでそこからしか読んでなかったが
「intを返す関数」と書いてあるのはどこか遡ってみた
で、742か
9E999とか書いてあるの見て思った

 ア ホ か !

付き合ってらんね
2022/05/11(水) 00:56:06.02ID:UPU3lDYb
逆参照て何?
どーかんがえても意味不明なんだが?
2022/05/11(水) 01:21:28.84ID:UPU3lDYb
>>597
数値としては
ビット0からビット17179869183の17179869184ビットあって
MSBのビット17179869183だけ1、それ以外全部0 という数
ちなみに log2(2^17179869183) = 17179869183 という数でもある
2022/05/11(水) 01:26:24.46ID:UPU3lDYb
ちなみに10進数で一応計算してみた
約だけど
4.63718218*10^5171655945
2022/05/11(水) 01:47:19.15ID:UPU3lDYb
100桁精度で計算してみた

2^17179869183 =
4.63718218509504584387714531277598505035321551306497981802919920776481\
1280740258379690028942685133666E+5171655945
775デフォルトの名無しさん
垢版 |
2022/05/11(水) 01:55:22.86ID:UPU3lDYb
1000桁
4.63718218509504584387714531277598505035321551306497981802919920776481\
1280740258379690028942685133665887678584875885591832718641905762127656\
8648464720428549339230429654230791681707765917647233112807227604202266\
5319507091896875357160842962215472898266643236555234127464648965219429\
4512975764838082263634232746025000505451315362217832502300416050059971\
6055861808134228895379488099475249306954395392974540860455538277768910\
6501779698066463774056727472854585596601051721933481196771957007013333\
1820937700316660548714353734677001021769055523397265041627700949880613\
6512390001031773699898144998699518865275093160899781961932357159230653\
7623370836815040562264217362228933327066544205490551615983201178741086\
9629443458030111199396338422961782744988511892557698949168820144192823\
3037701007229077794006504943886197679972934343613269571575719811291847\
2263408312031495611576479729358418227154841607037559274517841362656405\
8439611218916024169112008441360472444290176302521705087210814345468682\
750024133044013191605E+5171655945

これ以上は迷惑行為だからやめとく
2022/05/11(水) 02:49:25.02ID:IGkwLYWQ
僕まではセーフ
2022/05/11(水) 07:00:39.20ID:UPU3lDYb
一番大きい10進正数 ・・・・・・999 を NMAXとおくとき
NMAX * NMAX == 1
NMAX == -1
が言える
2022/05/11(水) 07:56:05.93ID:UPU3lDYb
ダチョウが死んだ
鳥インフルで殺処分らしい
2022/05/11(水) 21:23:58.71ID:Uorg83Ya
インフルエンザの季節じゃないと思うケド…
2022/05/11(水) 22:06:18.66ID:0NCcvhO8
◆◆ダチョウについて語る!!◆◆ [無断転載禁止]©2ch.net
https://rio2016.5ch.net/test/read.cgi/wild/1491662825/
2022/05/12(木) 12:52:25.00ID:ILoaqAhs
せっかく計算してやったのになんの感謝もないな
2022/05/12(木) 13:15:32.97ID:I3DTYm7n
>>712
に挑戦してみて
2022/05/12(木) 19:53:55.36ID:NvxU75Me
>>781
>>695に全桁
2022/05/12(木) 19:57:03.47ID:ILoaqAhs
どういう意図で質問してきてんだテメエ
ここは相談スレであってクイズスレじゃねぇんだよ馬鹿たれ
しかも、クイズのごとき問題出してもテメエで正解すら用意してない。
出て行けゴミ野郎
2022/05/12(木) 20:00:06.71ID:X+DkXX5S
はいはい、わかったわかった
2022/05/12(木) 20:04:07.89ID:NvxU75Me
>>782
宇宙中のリソースを使っても無理
もちろん近似であれば可能
2022/05/12(木) 20:41:05.66ID:I3DTYm7n
2^^6は
2120038728808211984885164691662274630835...............8862693010305614986891826277507437428736
であると書いているサイトがある。
2022/05/12(木) 21:01:03.42ID:NvxU75Me
有効数字1億桁とか下位1億桁なら簡単
全桁は不可能
2022/05/12(木) 21:21:17.12ID:I3DTYm7n
>>788
100桁ずつで良いからぜひぜひ
2022/05/13(金) 00:43:07.89ID:66pxKN84
なぜかというと筆算を考えたらワカル
真ん中に行くにつれて桁の値を求めるのが一番積和の項数が大きいくて大変でありかつ
LHSとRHSの数のあらゆる桁が関わるから誤差に対してもチョー敏感、
2022/05/13(金) 08:40:43.88ID:DjujgnVD
>>789
アップしてあるコードをちょっと変えれば出来るんだから
まずは自分でやってみなさい
2022/05/14(土) 13:54:53.41ID:rNqC99VF
>>765
見えない敵の可視化

>>695
mul_f2i()の中で
k1 = 1;
k2 = t360 - 1;
for (; k1 < t180; k1++, k2--) {
 double re, im;
 re = b->data[k1] * c->data[k1] - b->data[k2] * c->data[k2];
 im = b->data[k1] * c->data[k2] + b->data[k2] * c->data[k1];
 d->data[k1] = re;
 d->data[k2] = im;
}
としている積和絵算での誤差の拡大を問題視してないのはなんでじゃろがい?
別段b->data[・]もc->data[・]も絶対値が1未満と決まっているわけではないのでは……
決まっているとしても類似の大きさ同士の差で桁落ちが発生するのでは……
ケkッキョキ、誤差の適正な評価のためには>>679式に積和の都度上限と下限を見積もるしか無いんじゃないの
2022/05/14(土) 20:43:21.69ID:YcL0sj9T
Animalクラスを継承したCatクラスとDogクラスがあります

class Cat : public Animal
{
・・・
};

class Dog : public Animal
{
・・・
};

プログラムの中に無数にある以下のような箇所を

Animal *object = new Cat();

以下のようにDogクラスに書き換えたいな、と思ったとき

Animal *object = new Dog();

テキストエディタの一括置換機能を使うよりもっとスマートな方法ってありますか?
794デフォルトの名無しさん
垢版 |
2022/05/14(土) 20:57:04.02ID:HSfvjOUE
>>793
Cat.cpp とDog.cpp をバックアップする
Dog.cpp を削除する
IDEのリファクタ機能で Cat クラスを Dog クラスにリネームする
バックアップしていた Cat.cpp とDog.cpp を上書きで戻す

これで無数にある Cat を Dog に置き換えられる
文字列置換と異なり Catalog が Dogalog になってしまうこともない
2022/05/14(土) 23:08:55.47ID:qVX+uY2w
>>792
誤差はループ内のprintfで出力してるでしょ
誤差を減らす工夫が入っている事は気付いた?
2022/05/15(日) 00:01:26.20ID:qDTtv8xD
>>795
>誤差はループ内のprintfで出力してるでしょ
知ってたが>>792の演算をやった後の結果が入った事後データd->data[・]に対して
 x = d->data[i] * k;
 e = (int64_t)floor(x + .5);
 err_max = max(err_max, fabs(x - e));
とするだけではd->data[・]計算中に生じた仮数部LSBを超える誤差が全然見積もれていないんじゃな
いの
(唯一積の両側の絶対値が1以下だった場合は正当化されうるが、それはそれで似たような数の差での桁落ちを招きそう……

>誤差を減らす工夫
i2f()内で整数からフーリエ変換するときにRADIX / 2で事前carry_and_fix()してダイナミックレンジを抑えようとしている努力は認められる
しかしダイナミックレンジを抑えることが絶対的に誤差対策になるかというと以下略、

的な、
2022/05/15(日) 00:08:49.83ID:qDTtv8xD
多分仮数部LSBを超える誤差が整数部のLSBにまで達することは無い、という仮定のもとに
上のerr_maxの更新をやってるんだろうけど運悪く(RADIXが10だとして
9999.9999999999999
みたいなケースで仮数部LSB程度の誤差が生じたら最悪
 10000.0000000000000

  9999.9999999999999
かどっちかわからなくなって整数部LSBより上が誤差に侵食され(ry
2022/05/15(日) 01:29:26.60ID:Lu4IqK5o
>>794
ファイルを分ける
その発想はありませんでした
さっそく試させていただきます!
ありがとうございました
2022/05/15(日) 05:48:25.74ID:f/5Hvrjj
いつまでもFFTの話してるバカども、数論変換知らんの
2022/05/15(日) 07:10:32.52ID:zbEPSoXa
>>797
四捨五入によって丸めてるんだから
運悪くなんてことはない

配列の特定の箇所だけ極端に誤差が大きくなることもない

だからerr_maxで誤差評価可能
2022/05/15(日) 07:13:35.68ID:zbEPSoXa
>>799
コードは?
速度は?
2022/05/15(日) 09:10:05.29ID:d9+IDznH
一時オブジェクト指向全盛でGoF本なんかが崇められてたとき
ここで質問してるやつにデザインパターン見直せとか糞レス返してる奴いたが
最近はオブジェクト指向じゃ生産効率上がらないことわかってGoF本のステータスも低下してるのか?
2022/05/15(日) 09:19:34.13ID:duXfvT8B
今も昔も関係ない
GoF本をステータス視するのが間違ってる
デザパタを乱用するのも間違ってる
必要な人が必要なだけ黙って使うのがデザパタ
必要も無いのに手を出すことは間違ってる
今も昔もずーっと同じように間違ってる
2022/05/15(日) 09:41:49.69ID:d9+IDznH
オブジェクト指向じゃ生産効率向上しないことが明らかになって
そらGoF本の価値そのものが低下するわなww
new deleteなんて多用されたら困る分野なんていくらでもあるしな
2022/05/15(日) 10:04:41.30ID:zbEPSoXa
new deleteが全く使えない環境もある
2022/05/15(日) 11:58:56.10ID:c/66LOo2
>>804
こういうこという奴は大規模開発に参加したことないニワカだろうな
2022/05/15(日) 12:12:00.10ID:+H3bKj0a
自分を大きく見せようとするやつの
型どおりの言いぐさだな
808デフォルトの名無しさん
垢版 |
2022/05/15(日) 12:29:44.49ID:/JPgC0w0
オブジェクト指向がオワコンだったとしても代わりになるものって何かあるんですか?
2022/05/15(日) 12:39:29.05ID:jVQ55S+h
なんか上のレイヤしか触らんwebのひとがオブジェクト指向とデザインパターンをディスること多いわ
そらお前らが利用してるフレームワークを作るのに使っとるんやと
2022/05/15(日) 12:51:15.81ID:wSyZqypG
じゃあもうmain.cppにmain関数百万行書いて終わりにしていいんですか!?
2022/05/15(日) 12:56:30.62ID:0scjaaG3
オブジェクト指向がオワコンかどうかは知らないが
少なくとも「C++でオブジェクト指向開発」を謳っている案件は漏れなくクソだ
2022/05/15(日) 12:59:14.29ID:c/66LOo2
>>811
Chromiumってクソだったんだ
そんなクソがシェア圧倒的なこの世の中はクソまみれやね・・・
2022/05/15(日) 13:00:11.08ID:+mKsOYSe
最近はclassを使うプログラミングとオブジェクト指向プログラミングの両者のうちどちらが広くどちらが狭いとみなす?
2022/05/15(日) 13:00:45.47ID:MKS6oR3e
はよう糞まみれになろうぜ。
2022/05/15(日) 13:02:04.44ID:Q6Qf7/b7
あまりオブジェクト指向に固執すると
令和のstaticおじさんみたいなもんだぞ
2022/05/15(日) 13:03:51.85ID:c/66LOo2
>>815
staticおじさんはマウントされるだけの上位存在がいるから馬鹿にされた訳だけど、
>>808等も言ってるようにオブジェクト指向がクソだとして代替案があるのか?っていうと無いからはそうはならない
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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