Archiverse Internet Archive
投稿のみ 投稿と返信
前のページ(最近)
1132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152154
次のページ(過去)
返信[56]
親投稿
おちゃめ ochame_nako
pinfuさんへ 最初から全部理解できなくても少しずつ理解していけば良いと思います。 ちゃんと考えながら作ることが大事です。 けいさんへ 私も事前に(1)~(5)の内容を把握して問題を書いたのですが、実機で動かすと予想と挙動が違う部分があって困りました(笑) コータさんへ 限界の時に限らず浮動小数点は加減算でも誤差が発生しやすいですからそれを理解して使うのは大切ですよね。 さとしさんへ 指摘ありがとうございます。それは私の条件から抜けていましたね。 ツララさんへ FOR~NEXTでWHILE~WEND風に使うこともできますからね。
1そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
こういうのを見るとFOR~NEXTはGOTOやIF~THEN~の使い方を覚えた後の方が理解しやすいのが明白ですね。 WHILE~WENDとREPEAT~UNTILは入り口チェックと出口チェックを説明するため私のサイトのプチコン3号入門講座でもIFとGOTOを使って説明する予定です。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
私がプチコンmkIIで作ったポリゴン表示プログラムでトライフォースを表示したところフラットシェーディング込みで12~13fps出ました。 New3DSで動作するプチコン3号でGTRI命令を使えば500fpsくらい出そうな感じです。
0そうだね
プレイ済み
投稿
おちゃめ ochame_nako
新命令GTRIで256x192の範囲のランダムな座標で三角形を描画したところ1秒間に11088回描画できました。ちなみにmkIIで私が作ったGTRI相当のプログラムでは84回、そのプログラムをプチコン3号にベタ移植したものでは2000回だったので5.5倍速です。 ポリゴン表示プログラムにおいて三角形描画が処理時間の過半数を占めていたため表示が5.5倍速ならばジオメトリ演算とシェーディング処理がボトルネックになっても2倍弱の高速化ができそうです。 上記条件で1秒間に84回しか表示できないmkIIでもポリゴンによる3Dモデルを表示させたらジオメトリ演算とフラットシェーディング込みで実効300ポリゴン/秒の速度が出ました。それを考えればGTRI命令を使ったNew3DSならば実効で12000ポリゴン/秒くらいの速度が出そうです。
6そうだね
プレイ済み
投稿
おちゃめ ochame_nako
プチコン3号のver.3.1.0の更新が来たので早速SPEED TESTでベンチをとってみました。        ver.3.0.2 ver.3.1.0 たしざん    469342→512804 PRINTぶん    135141→143829 スプライトいどう246157→257266 ラインびょうが  66232→60896 ラインびょうがは低下しているもののそれ以外は若干高速化されています。 ほとんど誤差レベルですが。
6そうだね
プレイ済み
返信[44]
親投稿
おちゃめ ochame_nako
というわけで参加してくださった皆さんどうもありがとうございました。 残念ながら正解者こそ出ませんでしたが、個人的にはけいさん、ナルミンチョさんは正解扱いでも良い気がします。
0そうだね
プレイ済み
返信[43]
親投稿
おちゃめ ochame_nako
さとしさんへ もしかしたら誰も気づかないかもしれないと思ったその問題に気づいたのはすごいと思います。 pinfuさんへ 初心者でそこまで回答できるのはすごいですよ。 今回の問題ではなく普通の問題であれば正解扱いでした。 Oskarさんへ 実数型(倍精度浮動小数点)の誤差については上記解説の通りですが、これを場合分けするのは困難なので今回はこれは無しでも良いことにしました。 問題を書いた当初は場合分けをする予定でしたが、すべての場合をカバーするのはあまりに大変なのでやめたのです(笑)
0そうだね
プレイ済み
返信[42]
親投稿
おちゃめ ochame_nako
(上記の続き) 2.8-0.8を2進数に置き換えて桁を揃えて演算するとこんな感じになります。                            10.110011001100110011001100110011001100110011001100110 0.11001100110011001100110011001100110011001100110011001 1.11111111111111111111111111111111111111111111111111111 最下位bitは扱える仮数のbit数を超えているため切り捨てられる 1.1111111111111111111111111111111111111111111111111111 = 2-POW(2,-52) これがFLOOR(2.8-0.8)を計算した場合に2ではなく1になる理由だと思います。
0そうだね
プレイ済み
返信[41]
親投稿
おちゃめ ochame_nako
ナルミンチョさんへ 0.8と2.8は倍精度浮動小数点では下記のように表記されます。 0.8 = 0 11111111110 11001100110011001100110011001100110011001100110011001 2.8 = 0 00000000001 10110011001100110011001100110011001100110011001100110
0そうだね
プレイ済み
返信[40]
親投稿
おちゃめ ochame_nako
SEVENSEAさんへ 初心者ながらループ終了時にIの値が終了値(B)より1増えるのに気づいたのは良いことだと思います。 A、Bが小数である場合を考えると正しくは初期値+ループ回数+1になりますが。 ようすけさんへ A>Bの時ループ回数0に気づいたのは良いと思います。 けいさんへ たくさんレスをくださってどうもです。 レスをまとめるとほぼ正解といっても良いのではないかと思います。 コータさんへ POW(2,53)問題に気づいたのはすばらしいですが、あと一歩でしたね。 スーさんへ この問題は上記(1)~(3)だけではなく(4)、(5)のinf、nan、POW(2,53)に関して気づけるかを試したのですが本当にすべての場合を網羅するならば浮動小数点の誤差も考えないといけないですからね。
0そうだね
プレイ済み
返信[39]
親投稿
おちゃめ ochame_nako
この問題を解くことによって初心者が FOR I=A TO B (処理) NEXT というプログラムを作っていて正しく動かない場合の原因が特定できるようになると同時にFOR~NEXTは実はそんなに簡単なものではないということも分かると思います。 変数が複数あるとそれだけで場合分けが非常に多くなるし初期値と終了値の大小関係で結果が変わって来ますからね。 これに STEP C とかが加わるとさらに複雑になります。 プチコン3号の場合は終了値や増分量に論理式も使えますが、それを使った場合にはかなり処理が複雑化するためFOR~NEXTって実はすごく奥が深い命令であるというのが分かってもらえたのではないかと思います。
1そうだね
プレイ済み
返信[38]
親投稿
おちゃめ ochame_nako
つまり、指数が1増分すれば、仮数の最下位が1増分したときの値は2倍になっていくということです。 ちなみに0.1はこうなります。 0 11111111011 1100110011001100110011001100110011001100110011001100 倍精度浮動小数点であっても正確に表記はできません。 ただし、POW(2,53)+2をインクリメントするとPOW(2,53)+4と同じ値になることから最下位の下にもう1bitがありそうな感じです。
0そうだね
プレイ済み
返信[37]
親投稿
おちゃめ ochame_nako
POW(2,53)+2 = 9007199244740994 0 00000110101 1000000000000000000000000000000000000000000000000001 POW(2,53)+3はPOW(2,54)+4と同じ値で表記される POW(2,53)+4 = 9007199244740996 0 00000110101 1000000000000000000000000000000000000000000000000002 POW(2,54) = 18014398509481984 0 00000110102 1000000000000000000000000000000000000000000000000000 POW(2,54)+1~POW(2,54)+2は表記できない POW(2,54)+3はPOW(2,54)+4と同じ値で表記される
0そうだね
プレイ済み
返信[36]
親投稿
おちゃめ ochame_nako
補足 実数型(倍精度浮動小数点)の仕組み 2進数で表記した際に符号1桁、指数11桁、仮数52桁、合計64桁(64bit)で表される POW(2,53)-1 = 9007199244740991(絶対値がこれ以下の整数はすべて正確に表現できる) 0 00000110100 1111111111111111111111111111111111111111111111111111 POW(2,53) = 9007199244740992 0 00000110101 1000000000000000000000000000000000000000000000000000 POW(2,53)+1は表記できない
0そうだね
プレイ済み
返信[35]
親投稿
おちゃめ ochame_nako
中級者以上を自認するならば最低でも(1)~(3)は確実に覚えておく必要があります。 これらが抑えてあれば今回の問題ではなく普通の問題であれば正解といっても良いでしょう。 プチコン3号の仕様(infやnan)や実数型(倍精度浮動小数点)について熟知してない状態では回答するのが極めて難しい問題ですが、実はほとんど私のサイトのプチコン3号入門講座で書いています(笑)
0そうだね
プレイ済み
返信[34]
親投稿
おちゃめ ochame_nako
(5)値にinfやnanが含まれている場合は正しくカウントはできない   ループ回数は0、もしくは無限ループになる 今回は(1)~(5)のすべてが条件分けをして書いてあれば正解扱いにしました。 まだ0.1などの2の累乗で正しく表記できない小数は内部では循環小数になっていてその誤差によって発生するループ回数の変化も考えなくてはならないのですが、循環小数によって発生する誤差は場合分けをするのが困難なので今回はそれは無しでも良いことにします(笑) あとA=POW(2,-53)ようにA+1を実行した際に有効桁数落ちしてしまう場合はFLOOR(B-A)+1を手計算した時と実際のループ回数で差異が出るのですが分類が複雑になるため今回は無しでも良いことにしました。
0そうだね
プレイ済み
返信[33]
親投稿
おちゃめ ochame_nako
今回の問題のポイントは下記の5つです。 (1)ループ終了時にはカウンタの値は初期値にループ回数を加算したものになる(超基本)   FOR I=1 TO 10:NEXTならばループ終了時のIの値は11 (2)NEXT実行時(カウンタ増分時)にカウンタの値が終了値を超えるまでループを実行する   FOR I=1.6 TO 3.4の場合はループ回数は2回、終了時のIの値は3.6 (3)ループの終了値が開始値よりも小さい場合にはループはスキップされる   FOR I=3 TO 1:NEXTはループ内が1回も実行されないため終了時のIの値は3のまま (4)プチコン3号の実数型の有効桁数は16桁弱(2進数で52桁)である   正しく表現できる最大の整数は9007199244740991 = POW(2,53)-1でこれ以降は正しくカウントはできない
0そうだね
プレイ済み
返信[32]
親投稿
おちゃめ ochame_nako
正解例です。 AまたはBが、nanもしくは-nanの時  ループ回数0、終了時のIの値はA Aが-inf、またはBがinfの時  ループ回数無限、終了値なし A>Bの時  ループ回数0、終了時のIの値はA A<=Bの時  ABS(A)>=POW(2,53)またはABS(B)>=POW(2,53)の時   ループ回数無限、終了値なし   ただし、A=B、ABS(A)<POW(2,54)の場合に限り、ABS(A)=POW(2,53)+2+4*N(Nは整数)の時    ループ回数1回、終了値はA+2(※ループ回数とカウンタの増分量が一致しないのはこの場合のみ)  ABS(A)<POW(2,53)かつABS(B)<POW(2,53)の時    ループ回数FLOOR(B-A)+1、終了時のIの値はA+FLOOR(B-A)+1 恐らくこれで下記の除外項目以外はすべてカバーできているはずです。
0そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
格ゲーはアクションゲームやシューティングゲームなどとは異なりお互いの当たり判定はEVENにする必要がありますが、固定の矩形領域による判定だと動きによっては攻撃が当たってないのに当たっているような判定が行われてしまいます。 それを考えるとIF文を使って細かく判定を行うのはありですが、透明の当たり判定専用のスプライトを複数用意して動きによってその矩形サイズを変えてそれとの当たり判定をSPHITで行うのが最も自然で効率が良いと思います。
1そうだね
プレイ済み
返信[21]
親投稿
おちゃめ ochame_nako
これは端的に言えば手計算で合うように場合分けを行えば正解ということです。
0そうだね
プレイ済み