プログラミングの為の数学と算数 vol.2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG語りましょう。TIPS/Q&Aスレです。
0367デフォルトの名無しさん
2005/12/08(木) 23:13:51それ、確かに推奨はされてるけど、
ボットにアドレス収集されるのが嫌で、実際やってる人いなくない?
0368デフォルトの名無しさん
2005/12/08(木) 23:25:27俺はやってるよ
あるいは自働収集が嫌って言って
画像を使ったり余計な文字をはさんだりしてる人もいる
要は形式上の問題じゃなくて、
>>362みたいな状況にならないようにっていうのが
目的なんだし。
0369 【凶】 【308円】
2006/01/01(日) 07:54:110371デフォルトの名無しさん
2006/01/09(月) 00:38:04マージソートについて勉強してます
マージソートの配列の分割についてなんですけど
例えば8だけの場合は
4 4
2 2 2 2
1 1 1 1 1 1 1 1
とだけ分割できると思います。
ですが例えば要素が34の場合
17 17
と一回だけ分割すると素数になってしまいます。
更に極端にしますと
7や23などの要素の個数の場合はどう分割するのでしょうか・・
まだ勉強初めて1日だけなんでアレですが参考のページでもあると嬉しいです
0372デフォルトの名無しさん
2006/01/09(月) 00:49:45そりゃ、8と9に割ればいいじゃん。
0373デフォルトの名無しさん
2006/01/09(月) 00:54:24しかしその場合併合(マージ)しようとするとどんな風になるのでしょうか
グーグル先生のイメージ検索はエレメントの個数が偶数ばかりのもので・・
勉強してきます(´・ω・`)
0374デフォルトの名無しさん
2006/01/09(月) 00:56:370375デフォルトの名無しさん
2006/01/09(月) 03:02:59べつに偶数のときとかわらん。
違う数に分割されたからといって
コードの何処も変える必要なんかない。
そんな必要があったら
そもそもマージソートじゃない
0376デフォルトの名無しさん
2006/01/09(月) 10:30:58例えば9の場合、
4, 5
(2, 2), (2, 3)
((1, 1), (1, 1)), ((1, 1), (1, 2))
((1, 1), (1, 1)), ((1, 1), (1, (1, 1)))
と分割すればいい。
てか図解すると並列に見えるけど、実際の処理は再帰的に行われるから、
部分的に階層が深くなっても問題ない。
ttp://oku.edu.mie-u.ac.jp/~okumura/algo/archive/algo.lzh
の mergsort.c 読めば解るよ。
0377デフォルトの名無しさん
2006/01/09(月) 13:56:17つーか、聞く前に一度自分で実際にやってみ。
マージって全然個数の違う2つの列相手にもできるから。
例えば極端な話 1, 16 とかで分けてもマージできる。
0378マイク ◆yrBrqfF1Ew
2006/01/23(月) 00:20:53堀江由衣の処女
0379デフォルトの名無しさん
2006/01/23(月) 04:26:20/ 、゙ヽ、 ‐-'´ ヽ‐- / / ヽ
,/´ .., ヽ,,l_),' '、,ト/ / ヽ
/ ヽ,r' l .,、z:ュ、,_. ,、=,゙.-〈__r,'、 ヽ_
_.l ヽ」 , l. ´ ,r'ャ、`' i'rャ;| ゙‐ヽ、_,, /l
,l l| −'´ll ,ll ヽ. ''`¨¨´ ヽ | .,//゙l //\
l`l| l|ヽ ヽ 入 ,ィ _. ', l |l // }
l \ l| ,l ヽ_. ' `'゙`'‐'i゙ ,' |,l // l バカジャネーノ
/ '\ l|`l l ヽ`'. ,∠.ニフ / l ヽ // |
,l '\ l| .lヽ_l ` 、 、 い.... ,' /___/ | ∨/ ,}
| ヽl | ,| .ヽ', .ヽ`二フ.,' ヽ ,| ,l
| l ,l ' .、,_`,.ィ l \ /
ヽ | \. ヽ/ l ヽ /j
\ / ヽ ヽ | l /
゙l\.. / ヽ ヽj | , /
ヾ ヽ ヽ ヽ / ,l
ヽ、 ヽ l } / ,r
ヽ ヽ | /′ ,,...''
`'':..、 ___ ___,..-.. |, ,l , :..-‐'"´
 ̄ /lr‐‐‐'--、_..... l_,..-'''""'- "
0380デフォルトの名無しさん
2006/01/30(月) 23:54:04中心点から角度θの軸を考え、横2W縦2Hの長方形の中心がこの軸を移動するとして
長方形の頂点が円周上にくる点の座標は?
0382デフォルトの名無しさん
2006/01/31(火) 00:41:23人にモノ聞く態度じゃねぇな。
出直して来い。
0383デフォルトの名無しさん
2006/01/31(火) 09:44:41もしかして日本語が不自由な方なんでわ?
0384デフォルトの名無しさん
2006/01/31(火) 10:41:190385デフォルトの名無しさん
2006/01/31(火) 18:07:460386デフォルトの名無しさん
2006/01/31(火) 18:42:49r=-(Wcosθ+Hsinθ)+√(R^2-(Wsinθ-Hcosθ)^2) として
(rcosθ+W, rsinθ+H) …(1)
θの範囲は0≦θ<π/2だけどね。他の範囲は(1)式にある符号が変化するだけのはず。
0387デフォルトの名無しさん
2006/02/01(水) 08:22:33それだと、 W = H = 0 の時にしか、長方形の頂点が円周上にこないんじゃない?
「点の座標」ってのが長方形の中心だとしても頂点だとしても。
多分やつは問題を理解できてないんだろうなあ。
2Dゲーム作ってて、円形フィールドからはみ出さないようにしたい、と推測したがどうか。
0388デフォルトの名無しさん
2006/02/01(水) 17:20:04それだと浮動小数点でやってる場合、
点の座標を求めて=で判別したらイタイ目見そうだ。
(丁度等しくならなかった時に判定をスリ抜ける。)
不等式で「内側」の度合い評価できる基準を見つけないと。
0389デフォルトの名無しさん
2006/02/01(水) 17:29:09たぶん長方形の外接円で判定してごまかすのが楽なんじゃないかなぁ。
中心点同士の距離と半径だけで判定できる。
2乗ノルムでやれば平方根もいらないし。
もし精密にやりたければ上記の方法で簡易判定して明らかに接触しない事例を除いた上で
拙速するかもしれないケースだけ長方形を構成する線分が交差するかどうかを判定すれば
いいのかな。
0390デフォルトの名無しさん
2006/02/01(水) 17:31:22軌道は具体的に長方形の位置を計算する以外は無関係だね。
0391マイク ◆yrBrqfF1Ew
2006/02/04(土) 00:33:27を満たすxの値の範囲は
a < x <= b
このaとbと導かれる過程がわからん。
包茎じゃなくて東京六大学に在学中か卒業した人だけ答えてくださーい。
0392デフォルトの名無しさん
2006/02/04(土) 11:10:140393デフォルトの名無しさん
2006/02/05(日) 13:36:53| ̄| /> _ _ / _| | | />
| |// \ \ __ / / \ \. | |//
| \ \ \/ \/ / 〉 ヽ. | \
| |\ \ \ /\ / | ̄ ̄ ノ | |\ \
/::::/'"  ̄ヾi /  ̄ ̄ \ /::::/'" ̄ ̄ヾi /  ̄ ヽ
|:::::::| ,,,,,_ ,,,,,,| | ^ ^ | |:::::::| ,,,,,_ ,,,,,,| | ^ ^ |
|r-==( 。);( 。) | >ノ(、_, )ヽ、.| |r-==( 。);( 。) | >ノ(、_, )ヽ、.|
( ヽ :::__)..:: } ! ! -=ニ=- ノ ! ( ヽ :::__)..:: } ! ! -=ニ=- ノ !
ヽ ー== ; \ `ニニ´ / ヽ ー== ; \ `ニニ´ /
\___ !  ̄ ̄ \___ !  ̄ ̄ ̄
0394デフォルトの名無しさん
2006/02/06(月) 04:30:36あんなかでまともな偏差値誇ってんのは
東京 慶應 早稲田 だけだろ
あとの三つは……やめた。
0395デフォルトの名無しさん
2006/02/06(月) 11:34:15名大出のしがない漏れは
頑張って答えようとしたりせずにニヤニヤしてれば好いわけね?
0396デフォルトの名無しさん
2006/02/06(月) 19:59:060397デフォルトの名無しさん
2006/02/07(火) 22:59:21しかし>391ってまるっきり高校レベルじゃないか
0398デフォルトの名無しさん
2006/02/08(水) 12:53:00シッ! 皆わかっててニヤ(・∀・)ニヤしてるんだから!
0399マイク ◆yrBrqfF1Ew
2006/02/08(水) 18:49:120400デフォルトの名無しさん
2006/02/09(木) 10:40:54イヤー、オヂサン参ったな。ナント院卒だが答えられないぞ。
>391が出した問題の最後に示された条件:
> 包茎じゃなくて東京六大学に在学中か卒業した人
を満たすことができないからなー。何せ漏れは重度の冠頭包茎だし、
名古屋生まれの名古屋育ちで大学も院も名古屋大学だからな。
漏れがこの問題に答えるためには
東京6大学(慶応、上智、東京、明治、立教、早稲田)のどっかに入らないと
イカンわけだろ?
いやー回答者の資格に制限がある問題は難しいわ、ホント難しい、
全然答えられそうにないよwww
最近のセンター試験ってこんな答えるのが難しい問題出すの?(・∀・)
0401デフォルトの名無しさん
2006/02/09(木) 10:43:17相変わらず莫迦なコテだな。
0402400
2006/02/09(木) 11:08:11My包皮も切らないとイカンのかー。やっぱ難しいわ。
漏れ包皮ついてるほうが好きだし、
臆病者だから体の一部切るなんてコワいしなー。
0404400
2006/02/09(木) 17:45:26思うんだが学歴を今後も問題の条件に入れ続ける気なら
学歴板でも行ったらどうかと思う。
ここはプログラム板の数学スレだから学歴は関係ない。
そしてプログラムに関係ないセンター試験の問題について
受験生向け解説依頼を受け付けるスレでもない。
受験生ならオトナシク受験板でも行ってたほうがいいんじゃない?
大学受験板
http://etc4.2ch.net/kouri/
学歴板
http://tmp6.2ch.net/joke/
0405マイク ◆yrBrqfF1Ew
2006/02/09(木) 18:10:56答えなくなければね;)
0406デフォルトの名無しさん
2006/02/09(木) 18:16:130407デフォルトの名無しさん
2006/02/09(木) 18:39:45今後スルーが相応と思うがどうか?
0408デフォルトの名無しさん
2006/02/09(木) 19:39:20ー 再開 ー
0409マイク ◆yrBrqfF1Ew
2006/02/09(木) 21:36:08毎度スルースルーと言ってる割には毎度我慢できなくなってレスしちゃうんだね。
子供?;)
0410デフォルトの名無しさん
2006/02/10(金) 00:01:50近似的に解くべきだなw
0411デフォルトの名無しさん
2006/02/10(金) 02:34:30えーと、どこで笑えばいいのかな?
0412デフォルトの名無しさん
2006/02/10(金) 16:15:10じゃぁ、両端を探すために二分探索でもするか?
0413デフォルトの名無しさん
2006/03/01(水) 22:02:54m9(^Д^)
じゃなくて
;)
を無理して使うとこ
0414デフォルトの名無しさん
2006/03/03(金) 14:58:110415デフォルトの名無しさん
2006/03/09(木) 09:58:52とかがかわいくて好きでつ
0416デフォルトの名無しさん
2006/03/09(木) 11:39:330417デフォルトの名無しさん
2006/03/09(木) 11:56:571+1=
0418デフォルトの名無しさん
2006/03/09(木) 12:14:220419デフォルトの名無しさん
2006/03/09(木) 12:24:330420デフォルトの名無しさん
2006/03/09(木) 12:34:320421デフォルトの名無しさん
2006/03/09(木) 13:24:560422デフォルトの名無しさん
2006/03/09(木) 23:36:010423デフォルトの名無しさん
2006/03/10(金) 00:06:04a÷b の結果を四捨五入して ret に取得する処理を以下のようにしました。
[バージョンA]
// 除数と被除数の符号チェック
if ((a ^ b) < 0) {
// a, bが異符号
// ret = (a / b) - (1 / 2)
ret = (2 * a - b) / (2 * b);
}
else {
// a, bが同符号
// ret = (a / b) + (1 / 2)
ret = (2 * a + b) / (2 * b)
}
この方法だと正の場合0.5→1、負の場合-0.5→-1となり
数値0に対して正負の結果が対称になります。
(続く・・・)
0424423
2006/03/10(金) 00:07:03除算結果の整数部: n、小数部: s (s >= 0) としたとき
四捨五入後の結果
・s < 0.5 のとき n
・s >= 0.5 のとき n + 1
[実例]
・-0.6 = -1 + 0.4 = -1 + 0 = -1
・-0.5 = -1 + 0.5 = -1 + 1 = 0
・-0.4 = -1 + 0.6 = -1 + 1 = 0
・0.4 = 0 + 0.4 = 0 + 0 = 0
・0.5 = 0 + 0.5 = 0 + 1 = 1
としたいのですが、上手い方法が見つかりません。
一応、自分なりに考えて以下のように実装したら上手くいきました。
[バージョンB]
if ((a ^ b) < 0) {
// 正数にして計算を行う
a = abs(a); b = abs(b);
// ・整数除算の結果を -1 したもの
// ・小数部を割合化したもの(?)である (b - (a % b)) / b + (1 / 2) を四捨五入したもの
// を加えて求める。
ret = -(a + b) / b + (2 * (b - (a % b)) + b) / (2 * b);
}
else {
ret = (2 * a + b) / (2 * b);
}
除数、被除数の符号チェックをしたりしてスマートではないので
もっとシンプルにできる整数演算での上手い方法はあるのでしょうか?
よろしくお願いします。
0425デフォルトの名無しさん
2006/03/10(金) 00:11:330426423
2006/03/10(金) 01:16:10画像処理で使用するため浮動小数点は、できるだけ使用しないようにしています。
ちなみにバージョンA,Bともに四捨五入をするときは
ret = (a / b) + 0.5
= (a / b) + (1 / 2)
= (2 * a + b) / (2 * b) ←通分(だったっけ?)
のように0.5を足すようにしています。
0427423
2006/03/10(金) 01:32:01単純に0.5を足して切り捨てると除算結果が負数の場合に問題があるのです。
(たとえば、結果が-2のときは -2.0+0.5 → -1.5 → -1になってしまう)
そのためにバージョンAでは、除算の結果が正負で場合わけをして
+0.5か-0.5を切り分けることにしました。
0428デフォルトの名無しさん
2006/03/10(金) 02:46:54そもそもここに間違いがあると思うだけどな
0429デフォルトの名無しさん
2006/03/10(金) 11:44:35方法はそれしかない。可搬性を確保したい場合符号チェックは必然。
挙げられた例題は結果の精度として整数値しか必要でない
(小数点以下0ビットの精度)場合の固定小数点演算と看做すことができる。
固定小数点演算とは例えば小数点以下に2ビットの精度が必要な場合に
3ビット下駄を履かせて1→8、0.5→4とするなどして整数演算によって
一定精度の実数演算を行う方法だ。
その場合結局四捨五入の処理も必要になる。
最下位ビットが0か1かを決めるために剰余を使うのもまさに例題と同じだ。
(固定小数点演算という枠組みで考える理由は精度が異なる場合も
同じ考え方で統一的に考えられるというだけだ。)
そして符号の処理も結局必要になる。
ただ、符号付整数除算のハードウェア仕様としてはAもBもありえて、
ハードウェアの仕様を調べてそれに依存するなら処理を省略できる可能性はある。
通常の整数は2の補数表示をすることで正数に対する処理を転用して
負数を扱っているで0に対して表現が元々対称でない。
だからBバージョンが目当てなら見込みは割とある。
ハードウェアに依存しちゃうけどね。
0430デフォルトの名無しさん
2006/03/10(金) 11:58:452ビットの精度が必要な場合→3ビットの精度が必要な場合
精度は悪化するけど2bitの精度が必要な場合に3bit取って
剰余は見ないで最下位ビットだけ見て四捨五入って手はあるけどね。
0431423
2006/03/10(金) 14:08:49やはり、符号チェックは必要なのですね・・・
浮動小数を使いたくないというのは、参考にしているライブラリの処理速度を計測したところ
その結果から浮動少数は使っていないと思われるためです。
ちなみに、そのライブラリは Win32API のウィンドウとビューポート間の座標変換処理で
比較対照としているものは LPtoDP() という関数です。
こいつが結構くせもので、整数部を n 、小数部を s としたとき
だいたい s >= 0.47 で四捨五入して n + s → n + 1 としているのです。
(負数の場合も -1.53 = -2.0 + 0.47 = -1 [入]、-1.54 = -2.0 + 0.46 = -2 [捨])
上記のように、四捨五入の仕様は>>424のバージョンBと同じです。
整数演算で 0.47 くらいで四捨五入なんて特殊なことをしているので
何か整数演算独自の四捨五入の方式があるのかと思い質問させていただきました。
個人的にはバージョンBの除数、被除数の符号が異なる場合に
除算を2回行うというのに満足できないので、もう少し紙とペンで色々と考えてみます。
0432デフォルトの名無しさん
2006/03/10(金) 15:50:22その方が解析しやすい。
0433デフォルトの名無しさん
2006/03/10(金) 15:55:04小数点以下の数を10進表記するとそれだけで誤差が含まれる。
だからこの場合、実数に換算しないで考えたほうがよい。
つまり計算させてる事例に関わる整数の比がないと
何が行われているか正確なことはわからない。
LPtoDP()ってことは窓の大きさとディスプレイの解像度が絡むんだろ?
0434デフォルトの名無しさん
2006/03/10(金) 16:18:42ret = (2 * a + b*sgn) / (2 * b);
として sgn を 1か-1にすればいい
あるいは
ret = (2 * a + b*(sgn+1)-b) / (2 * b);
とすれば sgn+1 は 0か2なので 0か-1の変数fを使い
ret = (2 * a-b + 2*b&f) / (2 * b);
xor結果の最上位で fを-1か0にすればいい
・右へのビット幅だけシフト
・インラインアセンブラを使って符号拡張命令
して、符号ビットを埋めて ゴチャゴチャやる方法があるけど、そんなの使いたい?
0435デフォルトの名無しさん
2006/03/10(金) 16:27:53ret = (2 * a + (b^t)) / (2 * b);
として tを 0か-1とする方法もある
でもたぶん
ret = ( a + ((b^t)>>1) ) / b;
あたりでやってんじゃないかな
0436423
2006/03/10(金) 18:01:03>>432 >>433
座標変換のための設定は以下の通りです。
// マッピングモード設定
::SetMapMode(hDc, MM_ANISOTROPIC);
// ウィンドウ領域 (0, 0) - (1000, 1000)
::SetWindowExtEx(hDc, 1000, 1000, NULL);
::SetWindowOrgEx(hDc, 0, 0, NULL);
// ビューポート設定 (0, 0) - (10, 10)
::SetViewportExtEx(hDc, 10, 10, NULL);
::SetViewportOrgEx(hDc, 0, 0, NULL);
単純にウィンドウからビューポートへ(1/100)倍する変換です。
ウィンドウ、ビューポートのx座標をそれぞれ wx, vx として
-1000 <= wx <= 1000 の範囲で変換してます。
変換式は憶測ですが
vx = wx * (10 / 1000)
で求めていると思われます。
四捨五入の「入」、「捨」の境界は以下のとおり 0.46〜0.47 です。
(これ以外の146, 246, ...、-154, -254, ... でも同様の結果です)
wx = -54 → vx = -1 (-54/100 → -0.54 → -1 + 0.46 → -1)
wx = -53 → vx = 0 (-53/100 → -0.53 → -1 + 0.47 → 0)
wx = 46 → vx = 0 (46/100 → 0.46 → 0 + 0.46 → 0)
wx = 47 → vx = 1 (47/100 → 0.47 → 0 + 0.47 → 1)
>>434
その方法だと>>423のバージョンAと同じになってしまうんです。
今は>>424のバージョンB方式の四捨五入の実装方法で迷ってるんです。
0437423
2006/03/10(金) 18:03:48MSDNで調べたところウィンドウ領域は32bitを保証してビューポートは27bitしか保証しないと
明記されてます。
残り5bitを小数部とした固定小数点で計算とかをしているんですかね?
0438434
2006/03/10(金) 18:21:37折角書いてやったんだから、ちゃんと読め!
いいか その>>424のバージョンB ってのは a/bの符号によって
符号負 ret = (2 * a - b) / (2 * b);
符号正 ret = (2 * a + b) / (2 * b)
としたいわけだろ?
符号を sgn +1/-1 なら
ret = (2 * a - b*sgn) / (2 * b);
だろが!
0439デフォルトの名無しさん
2006/03/10(金) 18:57:40論外
ポイントになるのは、0.1刻みとして(-2.5〜-1.6), (-1.5〜-0.6), (-0.5〜0.4), (0.5〜1.4)
をどうやって同じグループにするかということ
0440デフォルトの名無しさん
2006/03/10(金) 19:21:540441434
2006/03/10(金) 19:27:10単に >>435の符号を入替えて
int div(int x,int y){
int sgn=x^y;
sgn=sgn>>31;
return (x-((-y^sgn)>>1))/y;
}
x/y = div(x,y)
-20/10= -2
-19/10= -2
-18/10= -2
-17/10= -2
-16/10= -2
-15/10= -1 -5/10= 0 5/10= 1 15/10= 2
-14/10= -1 -4/10= 0 6/10= 1 16/10= 2
-13/10= -1 -3/10= 0 7/10= 1 17/10= 2
-12/10= -1 -2/10= 0 8/10= 1 18/10= 2
-11/10= -1 -1/10= 0 9/10= 1 19/10= 2
-10/10= -1 0/10= 0 10/10= 1 20/10= 2
-9/10= -1 1/10= 0 11/10= 1
-8/10= -1 2/10= 0 12/10= 1
-7/10= -1 3/10= 0 13/10= 1
-6/10= -1 4/10= 0 14/10= 1
これでいいんだろ?
0442434
2006/03/10(金) 19:32:15ホントは四捨五入でret = (2 * a + (b^t)) / (2 * b) を使いたかったけど2つある2倍が嫌なんで
ret = ( a + ((b^t)>>1) ) / b; としたら、プラス側が6で変化したんで
ret = ( a - ((-b^t)>>1) ) / b; として、まあマイナス側に-6で変化したっていいやで 計算量優先にしたんだろ
0443434
2006/03/10(金) 19:59:13abs(x) の代わりに (x>>31)^x のようなのを使ってて出た誤差かな
0444デフォルトの名無しさん
2006/03/10(金) 20:05:540445デフォルトの名無しさん
2006/03/10(金) 20:28:42またおまえか。
0446423
2006/03/10(金) 21:07:51とても参考になりました。
特に>>434さんの方法には脱帽しました。
異符号の場合に -1 と XOR して1の補数を用いるなんて思いもつきませんでした。
と言っても、まだ完全には理解できてはいないのですが
先にお礼を言っておきたかったので。
本当にありがとうございました。
0447434
2006/03/10(金) 21:28:04#include <stdlib.h> に div という関数がある 除算とあまりを出す関数だ
div_t d=div(x+y/2,y);
if(d.rem<0) d.quot--; で d.quot を使えばいい
条件判断を無くしたいなら d.quot+d.rem>>31 でいい
たぶんコレが正解だろう
0448434
2006/03/10(金) 21:30:52普通の四捨五入をやりたいって事にやっと気付いた。 すまんな。
0449434
2006/03/10(金) 21:40:25#include <stdlib.h>
int divd(int x,int y){
div_t d=div(x+y/2,y);
return d.quot+(d.rem>>31);
}
int divd(int x,int y){
div_t d=div(x*2+y,y*2);
return d.quot+(d.rem>>31);
}
結果はどっちも >>441 と y=10では同じになる
0450434
2006/03/10(金) 22:11:31>単純に0.5を足して切り捨てると除算結果が負数の場合に問題があるのです
に騙されてしまった。
単純に0.5を足して切り捨てるのをやりたかったのだろう。
ただ、X86では除算の結果が負数になる場合は余りも負数になる。
a/b= n余りsなら
a = n*b + s = s+b+(n-1)*b となる修正をすればいい
アセンブラで書けば、
cdq
idiv
sqr edx,#31
add eax,edx
と4命令
0451デフォルトの名無しさん
2006/03/10(金) 22:13:38かけ算はいってるけど
int func(int a, int b){
int absa = (a >> 31) ^ a;
return (a + absa*b + (b>>1)) / b - absa;
}
0453434
2006/03/10(金) 22:21:39アセンブラだと4行なのに
使わないと除算とmodを別に計算するか div 関数を使う必要があるのが面倒な所
div関数だと結果も構造体渡しだからメモリアクセスが入って遅くなる
0454デフォルトの名無しさん
2006/03/10(金) 22:27:09あんなの使う気にならないんだけど。
0455434
2006/03/10(金) 22:34:07だったらインラインアセンブラでやるといいよ。
cだけで書くなら
x+=y/2;
int r=x/y;
if( (x % y)<0) r--;
return r;
0456434
2006/03/10(金) 22:54:48原理としては、 余りが負数にならないように巧くオフセットを加えてるわけだよね
巧い方法だけど、 a b が大きい時にオーバフローの問題が起きるね。
abs*a ではなくて
aよりも少しだけ大きい bの倍数 を計算させた方がいいのでは?
この場合 >>436 のように座標計算に使うのだから、 マッピングモード設定 時に予め計算させておけばいい
0457434
2006/03/10(金) 22:56:560458デフォルトの名無しさん
2006/03/10(金) 23:12:33廊下にたっていて、向かい側の壁にはたくさんの開くドア又は開かないドアA,B,C。。。。が無限にあって、
それを開くかどうか確認したい。
スタートはAとーAの間にいる。
。。。|D|C|B|A|−A|−B|ーC|−D|。。。っとドアが続く
最初に地点から一番近い、開くドアを見つけたいが、動く距離をxとして、
距離の総和がO(x)ペースになるように探したい。
例えば、A,−A,B,−B,C,ーCの順番で探していくと、
動く距離が、1、2、3、4、5,...nとなり、距離の総和は1/2*(n)*(n-1)となり、
O(X^2)のペースになるから駄目である。
っていう問題なのですが、何か良い探し法、アルゴリズムありますかね?
0459434
2006/03/10(金) 23:13:40( abs(a/b)+1)*b でどうだろ?
除算が遅いなら | b|をシフトしていって |a| を超えた所でもいいか
0460434
2006/03/10(金) 23:21:43で、開いてるか開いていないかの確率はどの程度なの?
というか確率を仮定して
右方に N1内で調べてみてなければ右側にN2個調べて 見つかる確率を求めてみたら?
右側で M番目に開けば左側でM番目まで調べ調べればいいでしょ
0461デフォルトの名無しさん
2006/03/10(金) 23:29:11それも考えたのですが、例えば、3つずつの固まりで調べていくとして、
C,B,A,-C,-B,-A,
F,E,D,−F,−E,−D
距離を考えていくと、
(3+1+1)+(3+1+1)+
(6+1+1)+(9+1+1)+、、、
となって、総和はどうなるのでしょう。。。
0462デフォルトの名無しさん
2006/03/10(金) 23:40:17初期位置より左側を A , C , E と2個おきに移動 して末端 n で(奇数個偶数個で微調整か?)
.... F D B と戻ってくれば O(x) っぽくならない?
0463434
2006/03/10(金) 23:47:520464デフォルトの名無しさん
2006/03/10(金) 23:51:11左の方を一つ探す「A」
右の方を二つ探す「-A, -B」
左の方を四つ探す「B, C, D, E」
右の方を八つ探す「-C, -D, -E, -F, -G, -H, -I, -J」
この要領でいけないかな。
0465デフォルトの名無しさん
2006/03/10(金) 23:55:52>A,−A,B,−B,C,ーCの順番で探していくと、
>動く距離が、1、2、3、4、5,...nとなり、距離の総和は1/2*(n)*(n-1)となり、
>O(X^2)のペースになるから駄目である。
「調べないけど移動してる」に オーダーのコストかかってる?
0466デフォルトの名無しさん
2006/03/11(土) 00:06:37そうすると、kブロックに区切って、
(1)+(1+1)+(3+1+1+1)+(7+1+1+1+1+1+1+1)+(15+1+1+1+1+1+...)+
= 1+1*2+3*2+7*2+15*2+....+?
■ このスレッドは過去ログ倉庫に格納されています