X



C++相談室 part160

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2022/04/15(金) 08:39:32.42ID:WMzvufu2
前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1645239402/
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くらいと分かる
2022/05/05(木) 10:34:08.63ID:QrYoef2b
10000007とかで割れって言ってるんだろ
これじゃ余分な7の誤差蓄積しまくって上位めちゃくちゃになるし、影響ないほど巨大な10^n近似素数使っちゃったら結局計算量は大差ない
競プロキッズの考えそうなこと
2022/05/05(木) 10:39:30.08ID:CLlK/Ylr
あごめん桁数は5171655948が正しいね
2022/05/05(木) 10:41:25.83ID:dV/D8sCJ
>>628
7の誤差ってなにけ?
整数なのに誤差とかあるん?
2022/05/05(木) 10:44:36.09ID:vEkkTSCd
>>627
10進での桁数は
17179869183*log2/log10
https://ja.wolframalpha.com/input?i=17179869183*log2%2Flog10
で計算できることは知っているが、
先頭の値はどうやって出すの?
2022/05/05(木) 11:11:25.53ID:Lziv+Vr+
ていうか対数知らんのだろうね
2022/05/05(木) 11:31:29.78ID:E1ivHqdi
>>613
自動的に昇進するだけで、デフォルトで多倍長って表現は違和感。
2**-1は0.5だけどデフォルトで浮動小数点ってわけじゃないよね
2022/05/05(木) 11:36:06.02ID:CLlK/Ylr
>>631
小数部だけをまた10の肩に乗っければいい
2022/05/05(木) 11:47:06.17ID:Z9g54GsT
整数で返すべき関数の実装あるんか?
636デフォルトの名無しさん
垢版 |
2022/05/05(木) 12:32:26.31ID:Ng8+cu+X
GMPでやってみたけどoverflowで落ちるな
2022/05/05(木) 12:52:41.09ID:vEkkTSCd
皆さんすみません>>597です。

2^17179869183

とりあえず
10^5171655945.66625415874401993568579902587321942922330151106009...
で勘弁してください。

実数が分かれば文字数で桁数も分かりますので、
実数が知りたかったんですが、ここまでしか分かりません。
お手数おかけしました。
多倍長電卓で計算できないんでプログラムならできるのかな?と思ったわけです。
現時点では計算時間とメモリを食いそうですね。
638デフォルトの名無しさん
垢版 |
2022/05/05(木) 17:24:23.79ID:irZh29WM
ざっくりとした大きさや上下数桁はわかっても全体を丸々把握するのは厳しそう
2022/05/05(木) 18:10:40.93ID:wHYrtDCY
https://ideone.com/O1rs45
誰か助けてー。
ウエブのレクチャー見て書いたんだけど、一件通ったと思ったらほかのテストが通らない。
デコーダが悪いのだろうか?というか、解釈狂ってるかなぁ??マジ解らん。

アドバイスクレクレ。
2022/05/05(木) 18:12:32.63ID:wHYrtDCY
まじ わか らん
2022/05/05(木) 18:17:21.57ID:/C0Dx8BU
>>639
std::uniform_int_distribution<int> ui('A', 'z');

大文字小文字?
2022/05/05(木) 19:01:19.69ID:wHYrtDCY
Aのほうが数字的に小さいのですよ。
2022/05/05(木) 19:06:48.31ID:p/xHapT/
>>639
V.push_back({ { D[i] }, i }); は V.push_back({ D[i], i }); じゃないの?
644デフォルトの名無しさん
垢版 |
2022/05/05(木) 19:40:11.06ID:jNTEQQGI
>>639
プログラムの意図がわからんから投げたわ

1. Data型の<1>要素の意味はなんだよ。typedefした行のコメントに書いといてほしい
2. 関数名を流し見る限り、ソート・エンコード・デコードの3つの仕事がある。中途半端に仕事が混ざってない?
2022/05/05(木) 19:50:34.56ID:p/xHapT/
>>644
ブロックソートアルゴリズムの実装をしているだろう。
とすると size_t はソートバリエーションのインデックスを表していると思われる。
2022/05/05(木) 21:14:55.46ID:tw5Ro1fM
Wikipediaのブロックソートを実装しようとしているのなら、
あちこち違ってるんで、修正版を貼っておく。
https://ideone.com/q008E8
647デフォルトの名無しさん
垢版 |
2022/05/05(木) 22:10:21.31ID:CGnulbl/
int64_tとsize_tを暗黙の型変換を期待して混ぜて計算するとはまる?

(int64t - int64t) + sizet >= int64t
の比較をしたら2つ目のint64tが大きくなっても(とは言っても全ての値は10~-10くらい)boolの値はずっと1でした。
比較の前まで切り出してprintfすると正しい値が出るのですが、比較式に組み込むとおかしくなります。
sizetをint64tにキャストすると正しく動きました。

暗黙の型変換はsizetをint64tにしてくれないのでしょうか

環境はWSL2のg++です。

教えて下さい
2022/05/05(木) 22:59:30.02ID:MaGUTczU
>>647
色々と面倒な細かいルールはあるんだが、大まかには

・ 二項演算子は原則としては大きい側の型に揃えてから計算する (符号は符号無しが優先。 結果の型もそれ)
・ size_t の大きさは処理系定義 (符号無しであることは保証される)
・ signed な型が unsigned に変換されると変換後の型の最大値より 1 大きい値で mod をとった値になる

というのがこの場合にかかわる重要なルールだと思う。
size_t は処理系定義だからその環境でどうだかわからんが uint64_t 相当だと仮定するぞ。
int64_t - int64_t の型は int64_t で、 int64_t + size_t は uint64_t になる。
つまり int64_t-int64_t の値が負数の場合でも常に正の値に修正される。
しかも値として常に 10~-10 くらいということは、
unsigned な値への型変換規則によってかなり巨大な値になってしまう。
たぶんこれが意図しない挙動の原因だと思う。
2022/05/05(木) 23:03:22.90ID:MaGUTczU
>>648
符号無しが優先って書いちゃったけど、これは大きさが同等なら符号無しが優先ってことね。
大きさに差があるなら大きい方の符号が採用される。
(大きさって言ってるけど実際には順位 (rank) の序列が定められている。 まあ大きさの順なので実質同じやろ。)
2022/05/05(木) 23:06:38.57ID:2L8NgwAH
size_t が非負の32 bit なら、int64_t の範囲内だから、OK だけど、
size_t が非負の64bitなら、int64_tの範囲外で無理

int64_tの非負の範囲は、63bitしかないから
2022/05/05(木) 23:20:02.75ID:MaGUTczU
例としてこういうのがあるとわかりやすいかな。

#include <iostream>
#include <cstdint>

int main(void){
auto a=std::int64_t(6)-std::int64_t(8)+std::uint64_t(1);
std::cout << a << std::endl;
}

結果として 18446744073709551615 が表示される。
2022/05/05(木) 23:39:48.09ID:Hm4Z5Kkb
というわけで高速化すた、
https://ideone.com/TWKDT6

動きを見る限り、2^17179869183が計算が終わるまで手元のPCで8時間ぐらいの見込み

(検算)
次のぐらいなら一瞬で出る(小数点の位置が手抜きなので指数の解釈に注意
2^1000 = 0000001 0715086 0718626 7320948 4250490 6000181 0561404 8117055 3360744 3750388. x 10^298
2^171798 = 0000002 2448900 7901275 1700257 1990086 5699838 8910190 8350859 7305786 1643657. x 10^51713

2^171798は>>620のでは4秒かかかっていたやつが100 msぐらいで出る
653647
垢版 |
2022/05/05(木) 23:52:14.24ID:CGnulbl/
皆様ありがとう。
たいへん納得できました
2022/05/06(金) 07:02:57.27ID:kL1BvaNc
ゴメス8時間と言う見積は指数の桁を一つ少なかった2^1717986918で見積もってたorz
やったら最新状況は↓こんな感じでこの後4^9×5815 = 1,524,367,360秒 = 48.304年かかることに、。n_
Calculating 2^17179869183 ...
n=17179869183, mbuf sz=2 --- 0 sec
n=8589934591, mbuf sz=2 --- 0 sec
n=4294967295, mbuf sz=2 --- 0 sec
...(中略)...
n=8191, mbuf sz=180374 --- 24 sec
n=4095, mbuf sz=360748 --- 96 sec x 4
n=2047, mbuf sz=721494 --- 385 sec x 4.10
n=1023, mbuf sz=1442986 --- 1467 sec x 3.81
n=511, mbuf sz=2885970 --- 5815 sec x 3.96
2022/05/06(金) 10:53:36.44ID:2sf+UfT7
生きてるうちに終わりそうでよかった
2022/05/06(金) 12:17:44.01ID:DqDgjvgu
python超初心者スレでひな形を教えてもらってpythonでプログラミングしたところ、

2^17179869183

4.637182185095045843877145312775985050353215513064979818029199207764811280740258379690028942685133666E+5171655945

になるようです。
ご参考まで。精度等未確認ですが。
2022/05/06(金) 12:40:01.31ID:DqDgjvgu
>>656
ちなみにこの計算は、
128倍精度浮動小数点数の最大値の計算で出てくる式の掛け算で区切った左側の値です。

128倍精度浮動小数点数 (2^((2^(35-1))-1))*(2-(2^-4060)) 5171655946桁の値 有効桁数1222桁

(2^((2^(35-1))-1))*(2-(2^-4060))

9.274364370190091687754290625551970100706431026129959636058398415529622561480516759380057885370267332E+5171655945
という値になりました。

精度等確認できる方はお願いします。
仮数部の最終桁の値は丸めになっているようなので+1されている可能性があります。
2022/05/06(金) 13:36:52.82ID:dNZjdeLr
>>646
修正感謝。自分のコードに転写してみたらちゃんと動いた。
これちゃんとブロックソートか解らないけど、可逆ではあるので圧縮してみるね。
本当にありがとう。
2022/05/06(金) 15:08:33.81ID:dNZjdeLr
https://ideone.com/xxiusG
詐欺れなーい。LZWの1ワードが2バイトだと、若干損位で収束してしまうな。

何でだー。圧縮理論のはずだろ~~。
2022/05/06(金) 15:20:41.30ID:HAMEIRFi
延々同じようなことやってる低学歴さんたちって>>623見えんの?
2022/05/06(金) 15:25:15.07ID:P9K99Ehi
C++ のプログラムでサスペンド/復帰をお手軽に実装するための定番の方法ってないですかね?
USR1 を受け取ったらメモリの内容を丸々ファイルにダンプして、復帰するときはそれを読み込んで続きから実行、くらい簡単な仕組みが実現てきたら嬉しいです
2022/05/06(金) 15:25:29.57ID:bNsO3W2u
>>659
真の乱数データならどのような圧縮アルゴリズムでも縮まんよ
2022/05/06(金) 15:28:31.87ID:dNZjdeLr
>>662
噂によるとLZWはエントロピー圧縮では無いので出来ても良いかと思ったんだけど、駄目か。
根拠は辞書捨てるからだけどね。

とりあえず完成。
2022/05/06(金) 16:06:26.56ID:DVOROdCT
>>661
WM_POWERBROADCAST ggrks
665デフォルトの名無しさん
垢版 |
2022/05/06(金) 17:03:00.97ID:Ai+BgFMJ
圧縮方式がなんだろうと可逆圧縮はデータ長が短くなるケースがあるならデータ長が長くなるケースが必ずある

65536通りの表記がある2byteデータで、1通りが1byteに圧縮できるとしよう。(0x0000→0x00)
残りの65535通りから256通りの表現を奪うので(0x00から始まるパターンが作れなくなる)、3byte長で表現しなきゃいけないやつが出てくる。

このへんはトレードオフだが、テキストデータとか一定の傾向があるデータのデータ長を短くできりゃいいだろ?
ランダムデータとか圧縮済みデータを圧縮するなんて考えない
2022/05/06(金) 17:26:03.51ID:dNZjdeLr
>>665
まぁ、そうですね。
LZWの性質上、一回出たモノを辞書から洗って一個追加して辞書に返す。という事をやるのです。
エントロピー圧縮では無いので乱数を詐欺れたら無敵だったのですけど、現実は厳しい。
2022/05/06(金) 18:18:33.94ID:lqMO+ITd
データ圧縮時にあり得る最大伸長率をまとめたサイトをどこかで見たような記憶があったんだけど
あらためて探すと見つからない……。 幻だったんだろうか。
668デフォルトの名無しさん
垢版 |
2022/05/06(金) 18:30:36.95ID:jJyKyUF7
>>667
ZipBombとかやべーやつもいるから安全に展開できるかの仕様の確認目的かな?

正攻法での最大圧縮率とかだと話が変わってきそうだが
2022/05/06(金) 20:00:41.83ID:AeHK35lN
>>660
繰り返し二乗法は分かったのだが
modを取る大きい素数の選び方が分からないので教えてほしい
2022/05/06(金) 20:02:30.43ID:L9gk7Obb
>>664
Linuxではどうすればいいの?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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