投稿
おちゃめ ochame_nako
プチコン3号の中~上級者向けの問題です。 FOR I=A TO B NEXT このFOR~NEXTにおいてA、Bの値によって変わるループ実行回数と終了時のIの値をすべて書いてください。(1つでも抜けていたら不正解扱いにします) 締め切りは3月3日23時、正解者には締め切り後に「そうだね」を付けます。 回答時にはネタバレチェックをお忘れなく!
2そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
回答例(あくまで書き方の例であり、正解例ではない) (例)A<Bの時、ループ実行回数はB-A+1、終了値はB このような感じで条件と実行回数と終了値はA、Bを使った式で表してください。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
自分で書いておいて何だけどこの問題は難易度が高すぎて誰も正解者が出ないかも・・・(笑) 以前のボタン入力判定の問題よりも格段に難しいです。
0そうだね
プレイ済み
返信[3]
親投稿
SEVENSEA SEVENSEA
初心者ですがためになりそうなので回答させて頂きます… A<=Bの時…  ループ回数:B-A+1回  終了時のI:I=B+1 A>Bの時…  ループ回数:∞回  終了時のI:終了しない
0そうだね
プレイ済み
返信[4]
親投稿
ようすけ youslzh
A<=Bの時、ループ実行回数は(B+1)-A、終了値はB A>Bの時、ループ実行回数は0、終了値はA
0そうだね
プレイ済み
返信[5]
親投稿
けい kei0baisoku
参加せざるを得ない← すみません、言ってみたかっただけです(^^; 問題に関する質問です。 I,A,Bは整数型限定でしょうか?実数か整数でしょうか? ノーヒントの場合はノーコメントで構いませんm(__)m
0そうだね
プレイ済み
返信[6]
親投稿
’A:初期値 ’B:終了値 ’N:ループ内実行回数 ’I:ループ変数の終了値 IF A>B THEN  N=0  I=A ELSE  N=B-A+1  I=B+1 ’=A+N ENDIF
0そうだね
プレイ済み
返信[7]
親投稿
スー thanks_0u0
正解者無しかも、ってことはまだ何かありそうな気がしますけれど、一応… ■A<=Bのとき ループ回数は、FLOOR(B-A)+1 終了時のIは、FLOOR(B)+(A-FLOOR(A)<=B-FLOOR(B))+A-FLOOR(A) ■A>Bのとき ループ回数は、0 終了時のIは、A こんな感じ、、なのかなぁ(´=ω=`) ちょっとだけ書き直し。
0そうだね
プレイ済み
返信[8]
親投稿
ナルミンチョ naru_starfy28
まず、AかBがnanだったら ループ回数は0 終了値はA それ以外で ■A<=Bの時、ループ実行回数はFLOOR(B-A+1)、終了値はA+FLOOR(B-A)+1 ■A>Bの時 ループ実行回数は0 終了値はA ■B==infの時 ループ回数は無限 終了値なし ■A==-infの時 ループ回数は無限 終了値なし 内部的の小数点表現うまくが出来ていないのかFLOOR関数やFORの抜け出しが合わないことが多い、手計算では合うはず。 FLOOR(2.8-0.8)は2のはずなのに1と出たりして困るそこを解決できれば…
0そうだね
プレイ済み
返信[9]
親投稿
スー thanks_0u0
infとnanも調べてみたので、もう一度…。 ■A<=Bのとき ループ回数は、FLOOR(B-A)+1 終了時のIは、FLOOR(B)+(A-FLOOR(A)<=B-FLOOR(B))+A-FLOOR(A) ■A>Bのとき ■Aだけがinfのとき ■ABの内一つ以上がnanのとき ループ回数は、0 終了時のIは、A ■Bだけ、またはABがinfのとき ループ回数は、無限 終了時のIは、なし FLOORだらけの計算はゴリ押しなので、もっとすっきりまとまる気もしつつ…(´=ω=`)
0そうだね
プレイ済み
返信[10]
親投稿
さとし SatoshiMcCloud
ここで皆さんを絶望のドン底に叩き落とすプログラムをお見せします。スクショのプログラムはAもBも特別な数ではないですし、A<Bを満たしているから(BーA+1)=2回動いて終了しそうに見えます。 で す が  実際には無限ループが発生し永久に止まりません。パーフェクト回答したい人はこの謎も解かないと…
0そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
回答でFLOOR関数を用いている人も居ますが、プチコン3号では誤差で正しい結果が出なくても手計算で合っていれば正解とします。 むしろ、手計算で合っていることが正解の条件です。 これはかなり大きなヒントですね! ちなみに締め切りまでは何度でも回答はOKなのでこれを見てやりなおしたい人は再チャレンジしてみてください。 現時点では正解者はまだ居ませんが明日までには正解者が現れそうな雰囲気です(笑) けいさんへ この問題は問題文のみで考えれば良いのでデフォの実数型で回答してもらって結構ですが、OPTION DEFINTが実行された状態を考慮してもらってもOKですよ。 ただし、現状よりさらに条件分岐が増えるとコメント1つには回答が収まらなくなりそうです(笑)
0そうだね
プレイ済み
返信[12]
親投稿
さとし SatoshiMcCloud
整数型でも無限ループはできます!(スクショ参照)
0そうだね
プレイ済み
返信[13]
親投稿
pinfu ANNAININ
初心者ですが・・・ 解説も分からないと思うけど、聞いてみたいのでトライ♪ A<B ループ回数=B-A+1 I終了値=B+1 A>B ループ回数=0 I終了値=A A=B ループ回数=1 I終了値=A=B 分からん!!
0そうだね
プレイ済み
返信[14]
親投稿
スー thanks_0u0
何にも思いつかなかったので降参して皆様の回答を眺めていたら、なかなか深そうな問題な気が…これは私の手には全然負えないでした(ノ´∀`*) さとしさんのお話は、ビットで表せるの限界のこと?でしょうか…。 整数型の方は仕組みがわかっているので、きっと&H7FFFFFFF+1した時に負数のビットが立ってしまって無限ループなのだろうと予想出来るのですが、倍精度浮動小数型の仕組みはよくわからないので謎です(´=ω=`) 例示されていた数値からは何故か偶数のみしか出なくて、下一桁だけ見ると、224666800024446888…となっているので、+1しても次の数値になれなくて無限ループ、なのでしょうか…STEPを2にしたら抜けられましたし。 不思議不思議ー\(( °ω° ))/
0そうだね
プレイ済み
返信[15]
親投稿
けい kei0baisoku
>おちゃめさん 回答ありがとうございます。ロジック的に整数は実数に含まれると考え、実数型のみを対象に考えてみます。 ノーコメントだったら念のため文字列型や配列型やNULLなど全部考慮しようかと思ってましたがさすがに大丈夫そうなのでやめます(^^;
0そうだね
プレイ済み
返信[16]
親投稿
pinfu ANNAININ
はっ! A=B  なら、 終了はA+1(B+1)か! ・・・どーせ、正解ではないが(´・ω・`)
0そうだね
プレイ済み
返信[17]
親投稿
けい kei0baisoku
前提として、プチコン三号で実数型が取りうる全ての場合に対しての解答です。 ただしfloor(x)はxを越えない最大の整数を表すものとします。 (1)AかBがnanか-nanの時、ループ実行回数は0回、終了値はA ---- これ以下は全て(1)に当てはまるものは除く ---- (2)Aが-infかBがinfの時、ループ実行回数は無限大、終わらないので終了値は無い ---- これ以下は全て(2)に当てはまるものは除く ---- (3)AがinfかBが-infの時、ループ実行回数は0回、終了値はA ---- これ以下は全て(3)に当てはまるものは除く ---- (4)A>Bの時、ループ実行回数は0回、終了値はA (5)A<=Bの時、ループ実行回数はfloor(B-A)+1回、終了値はA+floor(B-A)+1 以上です。
0そうだね
プレイ済み
返信[18]
親投稿
けい kei0baisoku
題意は多分(4)と(5)だけだろうと思いますが、一応変なやつも対応してみました。 他の方の解答はまだ見てません………(・ω・) この後見ます。
0そうだね
プレイ済み
返信[19]
親投稿
けい kei0baisoku
一点書き忘れ……… 「手計算で合っていることが正解の条件」とありましたので、計算機ゆえのビット数の限界もないものとしています。 >さとしさん 本題と分けて解答してみます(^O^) 一つ目のスクショは倍精度浮動小数の整数部の精度の限界に達していて、Bの値から1を足しても丸められてBのままだから、二つ目のスクショは符号つき32ビット整数の桁の限界に達していて、Bの値から1を足すとオーバーフローしてもっとも小さい負の値になるから、と考えました。どうでしょうか。
0そうだね
プレイ済み
返信[20]
親投稿
おちゃめ ochame_nako
けいさんへ 「手計算で合っていることが正解の条件」ですが、これはループ回数と終了時のIの値を回答する場合の表記に関する部分だけです。 思いついた条件はすべて書いてみてください。 普通の問題ならばけいさんが書いた(4)と(5)だけで正解ですが、今回は普通の問題ではないので(だから、難問扱いになっている)
0そうだね
プレイ済み
返信[21]
親投稿
おちゃめ ochame_nako
これは端的に言えば手計算で合うように場合分けを行えば正解ということです。
0そうだね
プレイ済み
返信[22]
親投稿
けい kei0baisoku
>おちゃめさん なんですと(°Д°) しまった、皆さんの解答も見ちゃいました……… しかも、計算機のビット限界を考慮してもさとしさんの投稿の部分以外は特に思い付かないかも……… 一応追加で解答してみます。
0そうだね
プレイ済み
返信[23]
親投稿
けい kei0baisoku
だ、ダメだ(><) いろいろ検証してみて多分法則は掴めたのですが、細かくまとめる時間は無さそうです。降参です。 一応、途中解答として分かったことを書いてみます。 -2^54未満は+1しても変わらない。 -2^54以上-2^53-2以下は、-2^54+2+4*Nならば+1すると2増える。(Nは0以上の整数) それ以外は+1しても変わらない。 -2^54-1以上2^54-1以下は、+1すると1増える。 2^53以上2^54-1以下は、2^53+2+4*Nならば+1すると2増える。それ以外は+1しても変わらない。 2^54以上は、+1しても変わらない。 書いてて思い出しました………ややこしい+2地帯は整数で割りきれない値の挙動の確認を忘れてました(´Д`) そこ調べて上記の全組み合わせを考えて整理すればまとまるのでは………と思います。多分。
0そうだね
プレイ済み
返信[24]
親投稿
ナルミンチョ naru_starfy28
条件は上の条件式ほど優先して ■A、Bにnanが含まれるなら ループ回数は0 終了値はA ■B==infの時 ■ABに2^53以上が含まれる かつ A<=Bの時 ■A==-infの時 ループ回数は無限 終了値なし ■A<=Bの時 ループ実行回数はFLOOR(B-A+1) 終了値はFLOOR(B-A+1) +A ■A>Bの時 ループ実行回数は0 終了値はA
0そうだね
プレイ済み
返信[25]
親投稿
ナルミンチョ naru_starfy28
多分2^53以上の時はそれに×2とか×4とかして表していると思う 数を表す時に52桁のビットがあってそれにかける値のビットが別にあると思う 2^53からの数の表現は2段階 2^54からは4段階 2^55からは8段階 2^56からは16段階…みたいな
0そうだね
プレイ済み
返信[26]
親投稿
けい kei0baisoku
連投すみません。一日経って、精度外の検証の仕方を間違えてたのに気付きました(´Д`) 変数が取りうる値自体が、普通に2^Nの倍数だけですよね……… もう少し単純そうなので、もう実機で検証はできませんが考えて書いてみます。 降参とか言いながら(^^; 簡略化のため、edge=2^53とする (5)A<-edge-1の時、実行回数は無限大 (6)edge<Bの時、実行回数は無限大 (7)それ以外、実行回数はfloor(B-A)+1回、終了値はA+floor(B-A)+1 ………でいいのかな?(・・;) 気が付いたのは網羅してると思います。 (ナルミンチョさんの新しい2コメントだけまだ見てません)
0そうだね
プレイ済み
返信[27]
親投稿
けい kei0baisoku
(6)は ×edge<B ○edge<=B なのに気付きましたが、ナルミンチョさんの回答見た後なのでそのままにします……(-ω-)
0そうだね
プレイ済み
返信[28]
親投稿
けい kei0baisoku
度々申し訳無いです………(-ω-;) 自力で気付いた点が1つあるので再回答させて頂きます。 さすがにそろそろ前の回答は消した方がいいかなとも思いましたが、後で見た人が流れが分からないのと、スパッと一回答えたように見えてずるい気もするので、取りあえずそのままにさせていただきますm(__)m 簡略化のため、edge=2^53とする (5)A<-edge-1の時、実行回数は無限大 (6)edge<=Bの時、実行回数は無限大 (7)edge-1<B<edgeの時、実行回数はfloor(B-A)+1回、終了値はedge (8)それ以外の時、実行回数はfloor(B-A)+1回、終了値はA+floor(B-A)+1 以上です。あと、ついでなので後で気付いた<=Bも直させて頂きました(-ω-)
0そうだね
プレイ済み
返信[29]
親投稿
ナルミンチョ naru_starfy28
上優先 ■A、Bにnanが含まれる ■A>B ループは 0 終了値は A ■B>=2^53 ■A<=-2^53-3 ループは 無限 終了値なし ■A<=B ループは FLOOR(B-A+1) 終了値は FLOOR(B-A+1)+A AとB=2^53+6 だとループ1回ループだが AとB=2^53+5 だとループ無限ループに…
0そうだね
プレイ済み
返信[30]
親投稿
’A:初期値 ’B:終了値 ’N:ループ内実行回数 ’I:ループ変数の終了値 IF A>B THEN  N=0  I=A ELSEIF A<=-1*POW(2,54)||POW(2,53)<=B THEN  ’無限ループ(回答なし) ELSE  N=FLOOR(B-A)+1  I=A+N ENDIF
0そうだね
プレイ済み
返信[31]
親投稿
Oskar oskar_liebig
締め切りすぎだけど、恐怖のどん底に陥れる落とし穴発見。 FOR I=-0.7 TO 0.3:NEXT → 1回 FOR I=-0.8 TO 0.2:NEXT → 2回 理屈は一応分かるものの、正しく場合分けして説明できる自信なし……
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そうだね
プレイ済み
返信[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そうだね
プレイ済み
返信[34]
親投稿
おちゃめ ochame_nako
(5)値にinfやnanが含まれている場合は正しくカウントはできない   ループ回数は0、もしくは無限ループになる 今回は(1)~(5)のすべてが条件分けをして書いてあれば正解扱いにしました。 まだ0.1などの2の累乗で正しく表記できない小数は内部では循環小数になっていてその誤差によって発生するループ回数の変化も考えなくてはならないのですが、循環小数によって発生する誤差は場合分けをするのが困難なので今回はそれは無しでも良いことにします(笑) あとA=POW(2,-53)ようにA+1を実行した際に有効桁数落ちしてしまう場合はFLOOR(B-A)+1を手計算した時と実際のループ回数で差異が出るのですが分類が複雑になるため今回は無しでも良いことにしました。
0そうだね
プレイ済み
返信[35]
親投稿
おちゃめ ochame_nako
中級者以上を自認するならば最低でも(1)~(3)は確実に覚えておく必要があります。 これらが抑えてあれば今回の問題ではなく普通の問題であれば正解といっても良いでしょう。 プチコン3号の仕様(infやnan)や実数型(倍精度浮動小数点)について熟知してない状態では回答するのが極めて難しい問題ですが、実はほとんど私のサイトのプチコン3号入門講座で書いています(笑)
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そうだね
プレイ済み
返信[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そうだね
プレイ済み
返信[38]
親投稿
おちゃめ ochame_nako
つまり、指数が1増分すれば、仮数の最下位が1増分したときの値は2倍になっていくということです。 ちなみに0.1はこうなります。 0 11111111011 1100110011001100110011001100110011001100110011001100 倍精度浮動小数点であっても正確に表記はできません。 ただし、POW(2,53)+2をインクリメントするとPOW(2,53)+4と同じ値になることから最下位の下にもう1bitがありそうな感じです。
0そうだね
プレイ済み
返信[39]
親投稿
おちゃめ ochame_nako
この問題を解くことによって初心者が FOR I=A TO B (処理) NEXT というプログラムを作っていて正しく動かない場合の原因が特定できるようになると同時にFOR~NEXTは実はそんなに簡単なものではないということも分かると思います。 変数が複数あるとそれだけで場合分けが非常に多くなるし初期値と終了値の大小関係で結果が変わって来ますからね。 これに STEP C とかが加わるとさらに複雑になります。 プチコン3号の場合は終了値や増分量に論理式も使えますが、それを使った場合にはかなり処理が複雑化するためFOR~NEXTって実はすごく奥が深い命令であるというのが分かってもらえたのではないかと思います。
1そうだね
プレイ済み
返信[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そうだね
プレイ済み
返信[41]
親投稿
おちゃめ ochame_nako
ナルミンチョさんへ 0.8と2.8は倍精度浮動小数点では下記のように表記されます。 0.8 = 0 11111111110 11001100110011001100110011001100110011001100110011001 2.8 = 0 00000000001 10110011001100110011001100110011001100110011001100110
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そうだね
プレイ済み
返信[43]
親投稿
おちゃめ ochame_nako
さとしさんへ もしかしたら誰も気づかないかもしれないと思ったその問題に気づいたのはすごいと思います。 pinfuさんへ 初心者でそこまで回答できるのはすごいですよ。 今回の問題ではなく普通の問題であれば正解扱いでした。 Oskarさんへ 実数型(倍精度浮動小数点)の誤差については上記解説の通りですが、これを場合分けするのは困難なので今回はこれは無しでも良いことにしました。 問題を書いた当初は場合分けをする予定でしたが、すべての場合をカバーするのはあまりに大変なのでやめたのです(笑)
0そうだね
プレイ済み
返信[44]
親投稿
おちゃめ ochame_nako
というわけで参加してくださった皆さんどうもありがとうございました。 残念ながら正解者こそ出ませんでしたが、個人的にはけいさん、ナルミンチョさんは正解扱いでも良い気がします。
0そうだね
プレイ済み
返信[45]
親投稿
pinfu ANNAININ
解説お疲れ様でした! 当たり前なのですが、やはり分かりません(笑) それでも、なんとなくでも、これからは何がどう動いているのか意識して使っていけたらなー、と思いました♪ 上級者向けの問題にも関わらず、初心者用のコメントありがとうございます!感謝です!! 邪魔にならぬよう、ネタバレコメントで・・・
0そうだね
プレイ済み
返信[46]
親投稿
A=-POW(2,53) ?A:?A+1:?A-1
0そうだね
プレイ済み
返信[47]
親投稿
けい kei0baisoku
>おちゃめさん 問題と解説、丁寧にありがとうございます。そしてスレ汚しスミマセン(^^; 途中で間違えたと思ってた方向が実はいいセンいっていたようでなんとも言えない気持ちです(-ω-) 今日、締め切りまでにもう一度実機使えてたらもうちょっとちゃんと正解に近づけたのかも……… 浮動小数の仕組みの基礎知識はありましたが、普段はそもそも精度の限界に近づかないように処理を回避するので、ここまで突っ込んで計算機の挙動と向き合うことはなく、勉強になりました。 それより浮動小数の仕組みを知らなさそうなスーさんとナルミンチョさんが核心を突いて理解しているように見えてそちらが驚きです………
0そうだね
プレイ済み
返信[48]
親投稿
けい kei0baisoku
>SEVENSEAさん、pinfuさん、他問題を見て考えてみた初心者の方 後半の考慮する点は相当マニアックですが、前半部分は基本の仕組みの理解にも繋がりますので、参加して自分で考えてみたというのはとても有意義だと思います(^O^) ポイント(2)のBを越えるまで、以外は私も最近まで把握してなかったですし………自分で手を動かすのが大事です(^^;
1そうだね
プレイ済み
返信[49]
親投稿
おちゃめさんへ 気づいた(?)のは、私では無く、プチコンです。 けいさんへ 限界近くで、丸め誤差が問題になるなら、実数を選択した時点で、設計時のバグというものだと思います。
0そうだね
プレイ済み
返信[50]
親投稿
さとし SatoshiMcCloud
スクショのプログラムはA<BかつABS(A)=POW(2,53)ですが、無限ループしません。正解例にないケースかと思います。
0そうだね
プレイ済み
返信[51]
親投稿
けい kei0baisoku
>コータさん そうですね。回避しようとしたら、計算には整数を用いて同じことをするか、スケールを小さく、または大きくして同じことをするか………辺りがまず考えられるでしょうか。 とは言っても、よく考えたら実際のソフト開発で桁の限界が影響する事ってfloatでも稀なので、ちょっとピンと来てないかもしれません……(-ω-) 等号使ったことによるバグの方はいつでも出るので気を付けてますが。
0そうだね
プレイ済み
返信[52]
親投稿
さとしさんへ 推定なので間違っているかもしれませんが、3DSのFEPの仕様が、おちゃめさんの想定している仕様と異なるためと思います。おそらく、仮数部のインプリメント仕様が、2の補数形式になっているのでは無いでしょうか。 (例えば、符号付き8bit整数の取り得る範囲は、2の補数形式だと&H80[-128]~&HFF[-1],&H00,&H01~&H7F[127]になりますが、符号を独立させると、ー&H7F~-0,+0~+&H7Fになります。)
0そうだね
プレイ済み
返信[53]
親投稿
けいさんへ 数値計算では、10進数の有効数字を想定する場合や、値の近い数値の引き算をすると有効桁数が、想定外に小さくなる場合があり、速度的に不利でも、可変長の十進数で計算するライブラリを使う場合があるらしいです。
1そうだね
プレイ済み
返信[54]
親投稿
ツララ LongIceSword
十分な時間が取れなくて参加出来なくて残念! なにげにmk2の繰り返し処理がFOR文だけだったっていうのも工夫次第で色んな応用が利く命令だったのを暗に示唆していたからなのかもしれませんね。 おちゃめさん、解説おつかれさまでした。参考になりました。
0そうだね
プレイ済み
返信[55]
親投稿
スー thanks_0u0
数学が苦手すぎて浮動小数の仕組みは理解出来なかったのですけれど、色々考えるためのヒントを知ることが出来てためになりました♪( ´▽`) -nan、-inf、という表現も見たことなかったですし、まだコンピュータ自体の仕組みの理解が乏しいので、ちょっとずつお勉強してみようと思います。 ためになる問題と詳細な解説ありがとうございます(*´∨`*)ノ
0そうだね
プレイ済み
返信[56]
親投稿
おちゃめ ochame_nako
pinfuさんへ 最初から全部理解できなくても少しずつ理解していけば良いと思います。 ちゃんと考えながら作ることが大事です。 けいさんへ 私も事前に(1)~(5)の内容を把握して問題を書いたのですが、実機で動かすと予想と挙動が違う部分があって困りました(笑) コータさんへ 限界の時に限らず浮動小数点は加減算でも誤差が発生しやすいですからそれを理解して使うのは大切ですよね。 さとしさんへ 指摘ありがとうございます。それは私の条件から抜けていましたね。 ツララさんへ FOR~NEXTでWHILE~WEND風に使うこともできますからね。
1そうだね
プレイ済み
返信[57]
親投稿
おちゃめ ochame_nako
スーさんへ A=POW(2,1024) (A=inf) B=-A (B=-inf) C=A-A (C=nan) D=-C (D=-nan) infと-infには大小関係がありますが、nanと-nanには大小関係がありません。
0そうだね
プレイ済み
返信[58]
親投稿
けい kei0baisoku
>コータさん 可変長の10進数ですか(°ω°) 初めて聞いたのですがなんだか面白そうですね。 言葉だけからのイメージですが、可変長配列に十進の一桁ずつを保存して管理&計算しているようなものでしょうか? 持てる桁を無限にして、誤差などをなくすための。
0そうだね
プレイ済み
返信[59]
親投稿
けい kei0baisoku
>スーさん 数学が苦手で整数の仕組みを既に理解されてるようでしたら、浮動小数も分かりやすい説明サイトとか見れば一発なんじゃないかなという気がしてます。 分かると色々腑に落ちると思います(^O^)
0そうだね
プレイ済み