C++相談室 part146
■ このスレッドは過去ログ倉庫に格納されています
わたくしが「現代現象」と呼称する一連の悲劇的な出来事は
なんの変哲もない日常がいきなり変貌を遂げるものであり
その猶予は0.1秒もない
スイスチーズモデルを天文学的数字ですり抜けたそれら現代現象への対処時間は大抵は1秒未満になる
なので未来になればなるほど思いもよらない意味不明で突発的で素早い破壊事象が起こる
これを踏まえて車載映像の事故映像を見てみると猶予が本当に少ないことが分かる
なので自動運転では各種の重い処理はマーフィーの法則によれば衝突する0.1秒前の「暇な時」に動き出す
これを超克するには未来予知が必要になる >>155
はちみつさんは lisp-er ですから、lisp-er 的な視点で現在のプログラミング環境をみれば、
やっと時代が lisp に追いついてきた、という感慨が発生するのも自然だと思いますよ
GC も lisp の産物ですから
「適正に欠く」と判断する推論内容は理解できませんね >>159
それは、おまえも適性を欠いているということだ
形容詞に比較をつけないとか、定量的でないとか、
魔法的にアレしてくれるだろうとか
おまえの頭ん中も同じだとここで露呈して今どんな気持ち? >>160
私に適性がないのはそのとおりなのでしょうが、いちいち定量的に条件を明示して話をしなければならないわけでもないでしょう
魔法的にアレするレイヤーの話は別途規定する前提で、今は特に大局観を語りたいときにはね
あなたは、戦術レベルの話はできても戦略レベルの話は理解できない大局観に欠いた狭量な、例えば java 屋さんに見えますね >>161
主張に説得力がないって指摘がおまえまだわからないのか?
あいた口が塞がらんわ ほんと攻撃的なやつが多いな
これだからC++界隈は >>132
>いずれネイティブコードを吐く C# コンパイラを出してくる
すでに出とるが
いつの時代の話しだ >>159
ワイは Scheme 使いでもあるし日常的には Scheme の方をよく使ってはいるが、
長いことバイナリマンだったし、 LISP の思想にそんな強い思い入れはないわ。
ただ、評価とかごちゃごちゃ言ってないで手早く書いて実測しろってのは LISP 的かもね。
今では他の言語でも書きながら速いサイクルで回して改善するスタイルって一般的じゃね?
書き始めは楽観的にやってるよ。
なるべく楽して必要になってから手間かけりゃいいんだよ。
そんでもってゆるふわに富豪的プログラミングしてても割と足りてしまう経験の方がおおいなぁ。
>>156
俺は趣味人やで。 > 富豪的プログラミング
相手してはいかんやつだったコイツ >>163
これだけ広いスパン使われて、いろいろな書き方がある言語なのに
ユーザーは多様性に非寛容というのはなかなか興味深い現象。 いや多様な使い方を求めるからこそ
GC厨の矮小な発想範囲を危惧するんだ >>170
この板で唯一まともな僕も赤くしておこう C#って、これ以上の普及はもう無理だろ。WindowsのUIアプリでしか存在価値はない。
MonoはイマイチでJavaはなくならんし、WebもAIもスクリプト言語系でOK。
タイムクリティカルなエンジン部をC++で書いて、スクリプト言語(Python含めて)
使うのが主流化してる。C#を使う場面が無い。 会社の上層部がMSの営業に騙されてAzureの導入を決めてしまった場合、
マネージドサービスの利用のためにはC#を使用せざるを得ない
他の言語では事実上使い物にならない Windowsのデスクトップアプリを手っ取り早く作るにはC#以外の選択肢が無い 保守的な経営者とそこそこの技術力の社員でも使えるんだからAzureというのは大したもんだな windowsに関わってる限りC#とC++/CLIからは逃れられない >>132
制限付きながら、既にネイティブコードは吐ける >タイムクリティカルなエンジン部をC++で書いて、スクリプト言語(Python含めて)
>使うのが主流化してる。C#を使う場面が無い。
主流て、そんなもん昔からほぼこういう書き方してるだろwww
そこで、スクリプト言語を使ってどれだけ実行時間に影響与えてるか正しく認識してないのが多い。
ここでC#使ってこんなに違うのかと初めて気づく。
そして、単に実行速度ってことならエンジンにC++使わずともC#でもそこそこ勝負できるってことも認識するのが情弱。
タイムクリティカルな用途ならそれこそOSからしてラウンドロビンなんか使わない。
RTOSでわざわざ、メモリプール設定してるのに、new/delete繰り返すようなC++流の書き方はそもそもよろしくない。
C++で非推奨の限りなくpure Cに近い書き方してるのはもはやC++とはいわんだろ。 > RTOSでわざわざ(中略)C++流
そう思い込んでる迷惑なのがいるんだよ
おまえみたいな タイムクリティカルもいろんなレベルがあるから
ハード実装
FPGA
OSレスのフルアセンブラ
RTOS + C
....
クラウド > C++で非推奨の限りなくpure Cに近い書き方してるのはもはやC++とはいわんだろ。
テンプレート、ラムダ、...を使いまくるコーディングだけがC++じゃない
小規模組み込みでnewすら使わない泥臭いC++もC++ 禿も必要な機能だけを使え、無理に全機能を使おうとするなって言ってるね クラスにupdateという関数があってそれが何回もメイン関数にあるインスタンスから呼び出されるのですが
update内で変数宣言を書いている場合、領域の確保は呼び出される度に行われますか? その宣言にstaticがついてなければ毎回領域確保が行われる 変数の宣言と定義、用語の違いを利用した罠かも知れん。 変数自体はスタック(またはレジスタ)に割り当てられるから
確保解放のコストは気にするな
変数の内部(コンストラクタ他)でのメモリ確保解放や初期化処のコストは当然気にしよう
パフォーマンスの問題であればクラス変数にする等 関数を使おうってときに
関数内変数をデータメンバに改造するアホが
うちの若いのにいたら焼きだ バッファをあらかじめ確保しておくなんて
ごく当たり前のことだと思ってたけど
そうじゃないのか?
updateなんていう、
クラスの内部に直結してそうな関数ならなおさら とか抜かすやつに限って計測もせずに片っ端から最適化と称した難読化をしやがる パフォーマンスの問題であれば
パフォーマンスに問題があるなら >>200
パフォーマンスの問題であるなら、まずは計測する
そして最適化厨が必死に難読化を施しているその箇所は、殆どの場合パフォーマンスに全く影響しない パフォーマンスを考えなくていいプログラムなら
そもそもC++を選ぶのが間違い パフォーマンスなのかフラグメントなのか使用リソースなのか
何を気にしてるのかはわからないけど 再入やマルチスレッドで死ぬ恐れもあるから、このレベルの初心者にバッファの事前確保が当然だなどという阿呆な考えを植え付けることはテロ行為に等しい >>191はstaticがついてなければyesで終わる話
それに勝手な前提つけたしていらん押し付けをするからお前らは駄目なんだぞ >>207
会話するのが嫌いならわざわざ書き込まなくて良いんだよ https://ideone.com/kprgQF
ちょっと暇だったので、
昔のビットシフトの掛け算と割り算って、
今の技術使ったら爆速になるんじゃないかと思ったのですよ。
で、書いてみたのだけど、知識不足で到達しないんだ。
なんでだろう?? >>202
そのプログラム全体が速度が要求される訳でもなかろう。必要なところだけ必要なぶんだけ高速化しろよ。
速度が要求されない部分も別にわざわざ別の言語で作るメリットがなければC++のままで構わないわけだし。 >>208
質問者にとっては混乱させられるだけの余分な情報だし、知っている人からすれば当たり前で価値のない情報だし、実のない議論したいだけの無意味な付け足しは要らんよ。 俺が言いたいのは一つだ。
C言語は超高等言語なので、その前にC++使うのだ! いやそもそも>>195の前半で解答は終わってるだろ
>>195の後半は余計 >>210
普通の型なら普通にC++で書いた方が良い
定数ならコンパイラが工夫する
普通じゃない型、例えば多倍長でも
1ビットずつシフトして速くなることは無いと思って良い >>210
>今の技術使ったら爆速に
ならねーよw >>217
ならないかー。
コンパイルタイム時に置き換えるから、1サイクルに落ちるものだと・・・。 なんか根本的にconstexprを勘違いしてる初心者がよくそういうこと言うけど
定数同士の計算の省略なんか大昔からある最適化だぞ
C++03以前を偉そうにデイスってる奴(>>210は別として)最近多いけど、そういうのに限ってこういう基礎が全くわかってない constexprの利点はtemplateとif constexprの組み合わせがおすすめだと思うの。 >>218を読まずに>>220を書いた
コンパイル時に解決するなら0サイクルだ よく分からない多倍長ライブラリを使うのであれば
当然コンパイル時に解決出来るとは限らない >>223
多倍長の乗算は筆算の要領で出来るの算数程度の数学で足りるが、
多倍長の除算は、CPUが持っている除算命令を使って行おうとすると
数学的な考える力が必要になる。アルゴリズムは既に有ることはあるはずだが、
丁寧に解説されているわけではないので自分の力で証明できるくらいの
人で無いと難しいと思う。 多倍長の乗算は、
非常に桁数が少ないときのみ筆算方式
もうちょっと大きいとカラツバ
もっと大きいとフーリエ変換
除算はニュートン法が一般的かと
もちろん、
特殊な形だと特殊な方法があったりする >>226
それは乗算と除算が逆なのでは?
除算は筆算流しか手はありません、乗算はいろいろなやりかた(カラツバ・FFT)があるようです >>228
>除算はニュートン法が一般的かと
ニュートン法で剰余を求めることはできますか? >>230
そりゃ当然出来ますよ
桁数が大きいときは、
除算は乗算の3倍程度の時間で出来ます 分子の桁数が大きくて分母の桁数が非常に小さい場合のみ筆算方式が有効
この場合も、
非常に遅い割り算命令なんかは使いませんが >>229
>除算は筆算流しか手はありません
そうではありません。除算をCPUにある除算命令を使った筆算で行うには、x/y の
xのBIT数を増やすのは容易ですが、yの方のBIT数を増やすのは非常に難しいのです。
不可能では有りませんが、非常に数学的な注意が必要となります。
私は数学マニアみたいなものなので、自分なりのアルゴリズムを作ったことが
ありますが、個人的には、それをするためにはテーラー展開の剰余項や解析学的な
知識が必要だと思っています。
考えもしませんでしたが、他にも除算は、ニュートン方を使う流儀もあるそうです。 >>233
いえ、そうでもありません。テーラー展開の剰余項を注意深く扱うと、
CPUがもつdiv命令を使った筆算の場合でも、x/y の y の方のBIT数を
増やすアルゴリズムがありえます。何度も書いてますが、それは数学的に
とても慎重さを必要とします。 >>235
ただし、ニュートン法を使う方法については考えたことがなかったので、
どっちが効率が良いかは分かりません。 >>235
普通のPCのDIV命令は30サイクル近くもかかる
乗算は1〜4サイクル
スーパーコンピューターでも除算は非常に遅い
>>233の条件では
除算命令などは使わない方が速い
除算は乗算に置き換えるのが普通 分母、分子それぞれの桁数によって
最適な方法は変わる
だからそういった条件をセットで語らないと意味がない 巨大な桁数同士だとニュートン法が速い
乗算の3倍ほどの時間で出来る
割り算を組み合わせたらそんな時間では計算出来ない >>231
ニュートン法(にゅーとんらぷそん)って、曲線で与えられる関数の根の一つを求める方法でしょ?
いわゆる実数の根を求める方法であって、整数の剰余を求めることはニュートン法では無理なのでは?
何がどうなって「当然」なんですか? >>241
で、その剰余はどうやって求めるのですか?
まさか、求めた商に除数をかけて被除数から引くのですか?それって遅くないですか? >>243
本当ですか?わざわざ、あらためて掛け算をするんですよ?私には馬鹿みたいな方法にみえますが? 馬鹿みたいな方法にみえるのはあなたが馬鹿だからです >>242
ニュートン法なので、
z = b / a の z を求めたい場合、直線 y = a * x - b と x 軸(y=0) との交点の
x を求めることによって行う。その際、x0, x1, ・・・, xn のように x を
漸化的に交点に近づけていく。数学的直感だと、その途中で剰余も求められ
るように出来そうな気がする。 >>246
色々なやり方はあると思うけど、2^m <= a < 2^(m+1) の場合、
x_{k+1} = x_k - (y_k << m);
y_{k+1} = a * x_{k+1} - b;
の漸化式でいけるかも知れない。
間違っていたらゴメンなさい。 >>246
その方法で乗算の3倍の時間で除算が出来ますか?
無理ですよね? >>248
漸化式が三回くらい行ったら正しい答えに到達するのであれば、
乗算の三倍程度の時間で済むと思う。
何回で到達するかは、まだ考えて無いのでわからない。 >>247
ここで、0<= y_k < x_k が満たされれば、x_k が商、y_k が余りだと思う。
初期条件は、
x_0 = 1;
y_0 = a * x_0 - b;
とすればよいはず。
途中、y_k が負の値になることが有るが、問題ない。 分母の桁数があまり大きくないならテーラー展開も有効だよ >>251
一般的な場合を取り扱うのであれば、その条件が、もっともらしいと思います。 ニュートン法を使うのは初めて聞きました。
とても勉強になります。 >>253
それで漸化式3回なんてことはあり得ないかと ■ このスレッドは過去ログ倉庫に格納されています